在VS 2005中,这段代码工作正常,但在VS 2010中我有错误 “无法从'std :: queue< _Ty> *'中推断'T *'的模板参数”
我无法理解问题是什么?求你帮帮我......
#include <string>
#include <queue>
using namespace std;
template<typename T, typename R, typename P1>
int bindthis(T* obj, R (T::*func)(P1))
{
return 1;
}
int _tmain(int argc, _TCHAR* argv[])
{
std::queue<std::wstring> queue_;
bindthis(&queue_, &std::queue<std::wstring>::push);
return 0;
}
答案 0 :(得分:3)
我不确定Visual Studio,但在GCC中,这个函数在C ++ 03模式下编译,但在C ++ 11模式下编译,所以我想问题是一样的。
问题是在C ++ 11中,向std::queue::push
添加了一个重载,因此编译器不知道要选择哪个重载。有两种方法可以解决这个问题:
明确指定模板参数:
bindthis<std::queue<std::wstring>, void, const std::wstring&>(&queue_, &std::queue<std::wstring>::push);
将函数指针强制转换为所需类型void (std::queue<std::wstring>::*)(const std::wstring&)
,以便选择正确的重载:
typedef void (std::queue<std::wstring>::*push_func_ptr)(const std::wstring&);
bindthis(&queue_, static_cast<push_func_ptr>(&std::queue<std::wstring>::push));