2010-05-25 111 views
7

我有一個類工廠,我正在使用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*))' 

我可以」不知道爲什麼它不會編譯,並且經過廣泛的谷歌搜索後,我找不到答案。任何人都可以告訴我我做錯了什麼(除了奇怪的變量名,這在上下文中有意義)?

+0

這些類是如何有用的?你能提供一個簡單的例子,說明如何編譯它們? – 2010-05-25 18:36:41

+0

這是爲了當你需要實例化一個派生類,但你只知道你在運行時需要什麼類。 'Args'參數用於類構造函數有參數的時候。 – user350096 2010-05-25 19:14:40

+0

在問題中包含的代碼'GenericFactory'甚至不是模板類。我想你應該修復它以獲得任何幫助。 – doublep 2010-05-25 19:15:35

回答

2

我認爲這是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