我正在尝试使用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(如果这是相关的)。
谢谢!
答案 0 :(得分:0)
map_type::iterator
是从属名称,因为map_type
取决于模板参数(InterfaceType
)。
随后,编译器不会假设map_type::iterator
为某个类型命名,除非您明确说明*。
因此,写
typename map_type::iterator iter = map().find(plugInName);
它应该编译得很好。
* 或名称查找找到一个,但这里不适用。