2010-05-25 26 views
7

Tôi có một nhà máy lớp nơi tôi đang sử dụng các mẫu variadic cho các tham số c'tor (mã bên dưới). Tuy nhiên, khi tôi cố gắng sử dụng nó, tôi nhận được các lỗi biên dịch; khi ban đầu tôi viết nó mà không có thông số, nó hoạt động tốt.C + + 0x lớp nhà máy với các vấn đề mẫu variadic

Đây là lớp:

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...); 
    } 
}; 

Dưới đây là lỗi: khi gọi (ví dụ)

// Tucked out of the way 
RegisterClass<DataMap, PDColumnMap, int, void *> RC_CT_PD(0); 

GCC 4.5.0 mang lại cho tôi:

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*))' 

Tôi có thể' t thấy lý do tại sao nó sẽ không biên dịch và sau khi googling rộng rãi tôi không thể tìm thấy câu trả lời. Bất cứ ai có thể cho tôi biết những gì tôi đang làm sai (ngoài tên biến kỳ lạ, có ý nghĩa trong ngữ cảnh)?

+0

Các lớp này hữu ích như thế nào? Bạn có thể cung cấp một ví dụ đơn giản về cách chúng sẽ được sử dụng nếu điều này được biên dịch không? –

+0

Đó là khi bạn cần khởi tạo một lớp dẫn xuất nhưng bạn chỉ biết lớp nào bạn cần khi chạy. Tham số 'Args' là khi hàm tạo của lớp có đối số. – user350096

+0

Trong mã bao gồm trong câu hỏi 'GenericFactory' thậm chí không phải là một lớp templated. Tôi đoán bạn nên sửa nó để được giúp đỡ. – doublep

Trả lời

2

Tôi nghĩ rằng nó barfing đây:

template <class Derived> 
static void Register(const KeyType &key, FactFunType fn) 
{ 
    FnList[key] = fn; 
} 

Bạn không sử dụng Derived trong chức năng này, nhưng nó có thể là rối tung lên nỗ lực gcc để giải quyết GenericFactory<...>.Register(...). Bạn cũng có thể muốn thay đổi điều đó thành GenericFactory<...>::Register(...).

+0

Cảm ơn, điều đó đã hiệu quả. Tôi biết nó phải là một cái gì đó đơn giản! – user350096

Các vấn đề liên quan