1

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

1 回答 1

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));
    
于 2013-01-28T16:29:37.397 回答