C++ 0x类工厂variadic模板问题
问题描述:
我有一个类工厂,我正在使用c'tor参数(代码如下)variadic模板。但是,当我尝试使用它时,出现编译错误;当我最初编写它没有参数时,它运行良好。C++ 0x类工厂variadic模板问题
这里是类:
template< class Base, typename KeyType, class... Args >
class GenericFactory
{
public:
GenericFactory(const GenericFactory&) = delete;
GenericFactory &operator=(const GenericFactory&) = delete;
typedef Base* (*FactFunType)(Args...);
template <class Derived>
static void Register(const KeyType &key, FactFunType fn)
{
FnList[key] = fn;
}
static Base* Create(const KeyType &key, Args... args)
{
auto iter = FnList.find(key);
if (iter == FnList.end())
return 0;
else
return (iter->second)(args...);
}
static GenericFactory &Instance() { static GenericFactory gf; return gf; }
private:
GenericFactory() = default;
typedef std::unordered_map<KeyType, FactFunType> FnMap;
static FnMap FnList;
};
template <class B, class D, typename KeyType, class... Args>
class RegisterClass
{
public:
RegisterClass(const KeyType &key)
{
GenericFactory<B, KeyType, Args...>::Instance().Register(key, FactFn);
}
static B *FactFn(Args... args)
{
return new D(args...);
}
};
以下是错误:当调用(如)
// Tucked out of the way
RegisterClass<DataMap, PDColumnMap, int, void *> RC_CT_PD(0);
GCC 4.5.0给我:
In constructor 'RegisterClass<B, D, KeyType, Args>::RegisterClass(const KeyType&) [with B = DataMap, D = PDColumnMap, KeyType = int, Args = {void*}]':
no matching function for call to 'GenericFactory<DataMap, int, void*>::Register(const int&, DataMap* (&)(void*))'
我可以”不知道为什么它不会编译,并且经过广泛的谷歌搜索后,我找不到答案。任何人都可以告诉我我做错了什么(除了奇怪的变量名,这在上下文中有意义)?
答
我认为这是barfing这里:
template <class Derived>
static void Register(const KeyType &key, FactFunType fn)
{
FnList[key] = fn;
}
您不要在此函数中使用Derived
,但它可能搞乱gcc的尝试解决GenericFactory<...>.Register(...)
。您可能还想将其更改为GenericFactory<...>::Register(...)
。
+0
谢谢,工作。我知道它必须是简单的! – user350096 2010-05-26 10:09:24
这些类是如何有用的?你能提供一个简单的例子,说明如何编译它们? – 2010-05-25 18:36:41
这是为了当你需要实例化一个派生类,但你只知道你在运行时需要什么类。 'Args'参数用于类构造函数有参数的时候。 – user350096 2010-05-25 19:14:40
在问题中包含的代码'GenericFactory'甚至不是模板类。我想你应该修复它以获得任何帮助。 – doublep 2010-05-25 19:15:35