2010-06-26 64 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>。同樣,如果它是一個靜態成員函數,你將得到一個普通的函數指針。如果使用非靜態成員函數,則會獲得指向成員的指針,並且必須在調用站點提供指針。

相關問題