2

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

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。

4

1 回答 1

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> } }
  { }

  /* ... */
};
于 2013-07-17T14:04:51.117 回答