指向模板方法的指针给出<unresolved overloaded =“”function =“”type =“”>)</unresolved>

时间:2013-07-17 13:51:13

标签: c++ templates overloading function-pointers

我已经阅读了许多有类似问题的人的问题,但大部分时间它们归结为使用函数指针而不是方法指针的人,或者在创建指针实例时省略了类范围。但是我没有做那些(我想......):

class Test
{
public:
    Test() { mFuncPtrs.insert( 10, &Test::Func<int> ); } // Error!

    template <class T>
    void Func() {}

private:
    typedef void ( Test::*FuncPtr )();
    std::map<int, FuncPtr> mFuncPtrs;
};

但是这给了:

error: no matching function for call to ‘std::map<int, void (Test::*)(), std::less<int>, std::allocator<std::pair<const int, void (Test::*)()> > >::insert(int, <unresolved overloaded function type>)’

但我明确了模板类型,提供了方法的全部范围,Func()没有重载!如果它有任何区别我正在使用g ++ v4.1.2。

1 个答案:

答案 0 :(得分:4)

您错误地使用了insert() std::map函数。 insert()没有重载,它将键和值作为两个单独的参数。

相反,您需要在std::pair键和值上调用它:

mFuncPtrs.insert(std::make_pair(10, &Test::Func<int>) );

或者,在C ++ 11中,您可以对该对使用统一的初始化语法:

mFuncPtrs.insert( { 10 , &Test::Func<int> } );

最简单的方法是完全避免使用insert(),只使用索引运算符:

mFuncPtrs[10] = &Test::Func<int>;

更好的是,鉴于所有这些都发生在构造函数中,即在地图的初始化时间,再次在C ++ 11中,你可以使用你的对初始化地图想:

class Test
{
public:
  Test()
    : mFuncPtrs { { 10 , &Test::Func<int> } }
  { }

  /* ... */
};