我已经阅读了许多有类似问题的人的问题,但大部分时间它们归结为使用函数指针而不是方法指针的人,或者在创建指针实例时省略了类范围。但是我没有做那些(我想......):
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。
答案 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> } }
{ }
/* ... */
};