以下模板定义
template <typename Func, typename ReturnType, typename... Arguments>
class Command
{
public:
Command(Func f) : m_func(f) { }
ReturnType operator()(Arguments... funcArgs) { return m_func(funcArgs...); }
private:
Func m_func;
};
当使用以下测试代码实例化时,会给出 gcc 4.7.3 的错误消息(错误:字段 'Command::m_func' 无效声明的函数类型):
void testFunction(int i, double d)
{
std::cout << "TestFunctor::operator()(" << i << ", " << d << ") called." << std::endl;
}
int main()
{
void (&fRef)(int, double) = TestFunction;
Command<void(int, double), void, int, double> testCommand(fRef);
}
如果我将没有地址运算符的 TestFunction 传递给 testCommand 构造函数,也会出现错误消息,但如果我传递显式命名的函数指针或使用地址运算符来传递参数,该错误消息就会消失。我的印象是,鉴于现代 C++ 设计的第 5 章,这段代码应该可以工作。
无法存储对函数的引用但函数指针工作正常的原因是什么?是否有任何解决方法可以在不失去对能够将仿函数作为参数传递给 Command 构造函数的支持的情况下进行编译?