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ため、コンパイラはどのオーバーロードを選択すればよいか分からないことです。これを修正するには、次の 2 つの方法があります。

  1. テンプレート引数を明示的に指定します。

    bindthis<std::queue<std::wstring>, void, const std::wstring&>(&queue_, &std::queue<std::wstring>::push);
    
  2. 関数ポインターを目的の type にキャストし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 に答える