【发布时间】:2013-02-13 11:01:35
【问题描述】:
我尝试使用 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++ 编译器 2012 年 11 月 CTP)
和 g++:
编译完成但出现错误:
source.cpp:在 'X::X(T) [with T = std::_Bind(Y*)>]'的实例化中:
source.cpp:28:33: 从这里需要
source.cpp:8:9: 错误: 调用不匹配 '(std::_Bind_helper(Y*)>), X* const, std::_Bind(Y*)>&>::type {aka std: :_Bind(Y*)>)>(X*, std::_Bind(Y*)>)>}) ()'
有没有办法解决这个问题。保存主要思想对我来说非常重要——一个可以用任何可调用对象(函数对象、函数指针或std::bind()函数返回的调用包装器)实例化的类。
如果有人帮忙,我将不胜感激。
附:如果我创建X 的实例,传递函数对象或函数指针,它就会编译。
【问题讨论】: