[英]Cannot convert from void to int
我试图通过它们的指针来调用函数。 编译此代码时,出现错误,指出无法将类型为void的表达式转换为其他类型,但是在调用函数之前,我先检查函数是否返回void。 我还有另一种方法可以做到这一点吗?
class FuncBase {
public:
FuncBase(string n, string ret, string arg1, string arg2): name(n), retval(ret), a1(arg1), a2(arg2) {}
string getName() const { return name; }
string getRet() const { return retval; }
string getA1() const { return a1; }
string getA2() const { return a2; }
virtual void call() = 0;
private:
string name, retval, a1, a2;
};
template <typename ret, typename arg1, typename arg2>
class Func: public FuncBase {
public:
Func(string n, string r, string ar1, string ar2, ret(*fc)(arg1, arg2)):
FuncBase(n, r, ar1, ar2), func(fc) {}
void call() {
arg1 ar1;
arg2 ar2;
cout << "You chose the " << getName() << " function" << endl;
cout << "Enter a " << getA1() << ": ";
cin >> ar1;
cout << "Enter a " << getA2() << ": ";
cin >> ar2;
if (getRet() != "void") {
ret val = (*func)(ar1, ar2);
cout << getName() << " returned " << val << endl;
}
else (*func)(ar1, ar2);
cout << endl;
}
private:
// pointer to function
ret(*func)(arg1, arg2);
};
对于失败的模板实例化, func
是一个函数指针,该函数指针接收两个参数并且具有void
返回类型。 那是ret
是void
。 返回类型为void的函数不返回任何内容。 自然,您不能读取(*func)()
的调用的返回值,因为您说没有返回值。
即使读取返回值的分支不会执行,它仍然需要编译并通过静态类型检查。 这里的根本问题是,对*func()
的调用在编译时处理,并且是主题编译时静态类型检查。
此堆栈溢出问题涵盖了与您完全相同的问题,并且可接受的答案显示了如何处理该问题
我假设'arg1','arg2'和'ret'都是模板参数。 鉴于此,即使代码会将您带到运行时路径(*func)(ar1, ar2)
,编译器仍必须编译ret val = (*func)(ar1, ar2);
,对于返回void的函数没有意义。 我认为这是给你的错误。 您能否为我们提供更多代码?
编辑:好的,现在我知道了您要做什么,您将需要执行以下操作来执行void和non-void函数,每种函数的行为不同:
int foo(){ return 5; }
void bar(){}
struct executor
{
template <typename T>
void exec( T (*func)())
{
T ret = (*func)();
cout << "Non-void function called, returned " << ret << endl;
}
void exec( void (*func)())
{
(*func)();
cout << "void function called" << endl;
}
};
int main()
{
executor ex;
ex.exec(foo);
ex.exec(bar);
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.