将<string,function =“”pointer =“”>插入map </string,>

时间:2010-06-26 05:34:01

标签: c++ stl map function-pointers typedef

我在将一些value_pairs插入地图时遇到问题。这是基本的想法。

// private
typedef Foo* (*Bar)( const std::string &x, int y );
typedef std::map<std::string, Bar> myMap;

template<class T>
Foo* DoThing( const std::string &x, int y ) {
  return new T( x, y );
}

myMap m_map;

// some map insertion code
m_map.insert( myMap::value_type( "blah", &DoThing<SomeType> ));
m_map.insert( myMap::value_type( "blech", &DoThing<OtherType> ));

这会给编译器错误提示no matching function call to std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Foo* (*)(const std::string&, int)>::pair(const char [5], <unresolved overloaded function type>)不确定我在语法上做错了什么,或者为什么我得到了unresolved overloaded function type。我最好的猜测是,它不知道DoThing会返回Foo*

感谢任何帮助,谢谢。

3 个答案:

答案 0 :(得分:5)

评论转换为答案:

可以肯定的是,DoThing<T>是一个全局函数,而不是任何类的成员,对吧?如果它在一个类中,它需要是一个静态成员函数。

另外,如果你拿一个成员函数的地址,一些编译器坚持用类名来限定它,例如&MyClass::DoThing<T>。同样,如果它是一个静态成员函数,您将获得一个普通的函数指针。如果是非静态成员函数,则会获得指向成员的指针,并且必须在调用站点提供this指针。

答案 1 :(得分:1)

你在第二个&amp;。

之前忘记了','

答案 2 :(得分:1)

我的猜测是它不知道如何将“blah”和“blech”转换为std :: strings。如果你明确地构造这些,我认为它应该有用。