2013-07-17 34 views
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

错误地使用了insert()函数std::mapinsert()没有超载,它将一个键和一个值作为两个独立的参数。

相反,你需要调用它的键和值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发生在构造函数中,即在intialization时间图,同样,你可以初始化地图与一对()你想要:

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

    /* ... */ 
}; 
+1

+1好上帝......这就是当你使用Qt太久会发生什么。谢谢! – cmannett85

相关问题