2013-03-30 89 views
1

我有向前聲明瞭一個結構,功能,並且定義使用的混凝土結構體類型的模板函數的報頭:向前聲明和模板實例上下文

--- header.h

struct RegisterImpl; 
RegisterImpl& getRegisterImpl(); 

template <typename Interface> 
void registerModuleClass(....) 
{ 
    RegisterImpl& reg = getRegisterImpl(); 
    reg.data = 3; 
    ... 
} 

--- source.cpp

struct RegisterImpl 
{ 
    int data; 
}; 

RegisterImpl& getRegisterImpl() 
{ 
    static RegisterImpl instance; 
    return instance; 
} 

struct testiFace 
{ 
    virtual void Blah() = 0; 
}; 

void useTemplate() 
{ 
    registerModuleClass<testiFace>(....); 
} 

我的希望是,模板功能registerModuleClass的實例打算在useTemplate發生,在這之後發生RegisterImpl類型已完全定義。但似乎代碼的那種類型的分辨率是發生在這裏的模板定義存在的地方,而不是實例化(在源文件)

我在這裏失去了一些東西?這裏的困境是模板函數需要使用實現的具體類型,但具體類型發生在源文件中。任何方式在這個?

回答

1

我不確定這個建議是否有助於您的情況,但這裏有一個想法:您可以將代碼包裝在需要RegisterImpl作爲模板參數的類模板中。

例子:

template<typename T> 
struct Helper 
{ 
    T & getRegisterImpl() 
    { 
     static T instance; 
     return instance; 
    } 

    template<typename Interface> 
    void registerModuleClass() 
    { 
     T & reg = getRegisterImpl(); 
    } 
}; 

及更高版本:

struct RegisterImpl 
{ 
    int data; 
}; 

Helper<RegisterImpl> helper; 

我希望這有助於。

0

讓它依賴於模板參數(S):

template<typename T, typename...> struct depend { typedef T type; }; 

template <typename Interface> 
void registerModuleClass(....) 
{ 
    typedef typename depend<RegisterImpl,Interface>::type LocalRegisterImpl; 
    LocalRegisterImpl& reg = getRegisterImpl(); 
    reg.data = 3; 
    ... 
}