我正在嘗試使用this answer中的概念實現一個簡單的插件管理器。我將它作爲模板實現,以便我可以爲不同的管理器實例化不同接口的插件。在模板中使用模板參數作爲參數
但是,我無法得到它編譯。
這裏是演示了該問題的摘錄:
#include <map>
#include <string>
template<typename InterfaceType>
class PluginManager {
public:
// Map between plugin name and factory function
typedef std::map<std::string, InterfaceType*(*)()> map_type;
static InterfaceType *createInstance(std::string const& plugInName) {
map_type::iterator iter = map().find(plugInName);
if (iter == map().end())
return 0;
return iter->second();
}
protected:
static map_type & map() {
static map_type map;
return map;
}
};
class MyInterface {};
PluginManager<MyInterface> myInterfacePluginManager;
int main(int argc, char *argv[]) {
}
當試圖編譯它,這是發生了什麼:
$ g++ pimgr_bug.cpp
pimgr_bug.cpp: In static member function ‘static InterfaceType* PluginManager<InterfaceType>::createInstance(const std::string&)’:
pimgr_bug.cpp:12: error: expected ‘;’ before ‘iter’
pimgr_bug.cpp:13: error: ‘iter’ was not declared in this scope
pimgr_bug.cpp:15: error: ‘iter’ was not declared in this scope
這似乎是與map_type的定義:如果我改變它,以便map值類型是它編譯好的一些具體類,但是值類型定義爲InterfaceType*(*)()
或實際上與InterfaceType相關的任何東西,則它不起作用。該映射應該保持插件名稱和指向相應工廠函數的指針之間的映射。
我幾乎可以肯定缺少對模板語法的一些基本理解!
當然,是否有可能在一個模板中創建一個映射,其中包含由模板參數之一定義的類型?
我正在使用gcc 4.4.7,不幸的是不能使用C++ 11(如果這是相關的)。
謝謝!
嘗試添加「typename」,即「typename map_type :: iterator」。 –
gcc 4.8提供了一個更有用的錯誤信息:*因爲'PluginManager :: map_type'是一個相關範圍,所以在'PluginManager :: map_type :: iterator'之前需要'typename' * –
Walter
@MichaelAaronSafyan修復了它。 ..如果這不是重複請添加作爲答案 – harmic