我尝试使用 VC11 和 g++ 4.7.2 编译以下示例:
#include <functional>
class X {
public:
template <typename T>
explicit X(T t)
{
std::bind(&X::invoke<T>, this, t)();
}
private:
template <typename T>
void invoke(T t)
{
t();
}
};
class Y {
public:
void foo() {
//...
}
};
int main() {
Y y;
X x(std::bind(&Y::foo, &y));
return 0;
}
但它以错误结束。我不确定粘贴整个编译器输出是否合理,但通常
vc11 说:
错误 C2664: 'void std::_Pmf_wrap::operator ()(_Farg0 &,_V0_t) const' : 无法将参数 3 从 'void' 转换为 'std::_Bind,Y *,std::_Nil,std::_Nil ,std::_Nil,std::_Nil,std::_Nil,std::_Nil>' c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional 1152 1 ConsoleApplication1 (Microsoft Visual C++ Compiler Nov 2012 CTP)
和 g++:
编译完成但出现错误:
source.cpp: In instance of 'X::X(T) [with T = std::_Bind(Y*)>]':
source.cpp:28:33: required from here
source.cpp :8:9: 错误:不匹配调用 '(std::_Bind_helper(Y*)>), X* const, std::_Bind(Y*)>&>::type {aka std::_Bind( Y*)>)>(X*, std::_Bind(Y*)>)>}) ()'
有没有办法解决这个问题。保存主要思想对我来说非常重要——一个可以用任何可调用对象(函数对象、函数指针或函数返回的调用包装器std::bind()
)实例化的类。
如果有人帮助,我将不胜感激。
PS如果我创建一个实例X
,传递函数对象或函数指针,它就会编译。