2010-06-26 65 views
2

我在插入一些value_pairs到地图时遇到了问题。这是基本的想法。将<string,function pointer>插入地图

// 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*

任何帮助表示感谢,谢谢。

+0

不能用g ++重现。 – kennytm 2010-06-26 06:13:11

+0

我正在使用g ++。嗯..使模板功能更具体一点。 – ggg 2010-06-26 06:16:48

+2

可以肯定的是,'DoThing '是一个全局函数,不是任何类的成员,对吧?如果它在类中,它需要是一个静态成员函数。 – 2010-06-26 06:24:23

回答

1

您在第二个&之前忘了','。

+0

只是在邮件中输入错误。这不是错误。 – ggg 2010-06-26 06:01:36

1

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

+1

这肯定是问题之一,但没有解决。 – ggg 2010-06-26 06:10:44

5

评论转换回答:

只是可以肯定,DoThing<T>是一个全球性的功能,而不是任何类的成员,对不对?如果它在类中,它需要是一个静态成员函数。另外,如果你使用成员函数的地址,那么一些编译器会坚持用类名来限定它,例如, &MyClass::DoThing<T>。同样,如果它是一个静态成员函数,你将得到一个普通的函数指针。如果使用非静态成员函数,则会获得指向成员的指针,并且必须在调用站点提供指针。

相关问题