无法推断VS 2010中的模板参数

时间:2013-01-28 16:01:35

标签: c++ visual-studio-2010

在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;
}

1 个答案:

答案 0 :(得分:3)

我不确定Visual Studio,但在GCC中,这个函数在C ++ 03模式下编译,但在C ++ 11模式下编译,所以我想问题是一样的。

问题是在C ++ 11中,向std::queue::push添加了一个重载,因此编译器不知道要选择哪个重载。有两种方法可以解决这个问题:

  1. 明确指定模板参数:

    bindthis<std::queue<std::wstring>, void, const std::wstring&>(&queue_, &std::queue<std::wstring>::push);
    
  2. 将函数指针强制转换为所需类型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));