недопустимое использование выражения void в контексте c ++ std :: function - PullRequest
3 голосов
/ 31 октября 2019

В приведенном ниже фрагменте кода при вызове функции обратного вызова «Недопустимое использование выражения void» компилятор высвечивает ошибку.

#include <iostream>
#include <functional>
using namespace std;
template<class type>
class State {
public:
State(type type1,const std::function<void (type type1 )> Callback)
 {

 }

};

template <class type>
void Callback(type type1 )
{
  //Based on type validation will be done here
}

 int main()
 {
  State<int> obj(10,Callback(10));
  return 0;
}

Просто хочу узнать, что здесь не так, чтобы это можно было исправить. .

Ответы [ 3 ]

1 голос
/ 31 октября 2019

Я думаю, это то, что вы хотите

#include <iostream>
#include <functional>

using namespace std;
template<class type>
class State {
public:
State(type type1,const std::function<void (type)> callback)
 {
    callback(type1);
 }

};

template <class type>
void Callback(type type1 )
{

}

 int main()
 {
  State<int> obj(10, Callback<int>);
  return 0;
}
1 голос
/ 01 ноября 2019

Я бы хотел использовать подход лямбда-выражений, чтобы избежать путаницы:

#include <iostream>
#include <functional>
using namespace std;
template<class type>
class State 
{
public:
State( type type1, const std::function<void (type type1 )> Callback)

    {
        Callback(type1);
    }
};

int main()
{

 State<int > monitor(10,[] ( int fault) {std::cout<<"Any Message"; });
 return 0;

}
1 голос
/ 31 октября 2019

Кажется, что вы хотите передать саму функцию Callback<int>, а не ее возвращаемое значение (которого нет) в конструктор obj. Так что просто сделайте это:

State<int> obj(10, Callback<int>);

Ваш текущий код на самом деле сначала вызывает Callback(10), а затем пытается принять void «возвращаемое значение», чтобы передать его конструктору obj. Передача void не разрешена в C ++, поэтому компилятор жалуется. (Callback(10) здесь " void expresson ").

...