2016-05-12 120 views
3

我有一些具有模板化功能的輔助模板。我使用它爲其它基於策略的模板類投或不投一定的參考價值特定類型:具有模板化功能的專業化模板類

// use this when needed additional value cast 
template <typename T> 
struct AdditionalValueStaticCaster 
{ 
    template <typename U> 
    static T cast(U u) 
    { 
     return static_cast<T>(u); 
    } 
}; 

// use this specialization when no needed to cast value 
template <> 
struct AdditionalValueStaticCaster<void> 
{ 
    template <typename U> 
    static U cast(U u) 
    { 
     return u; 
    } 
}; 

現在我想這些類分開來聲明和實現(h和.hh文件)

所以我寫的聲明是這樣的:

template <typename T> 
struct AdditionalValueStaticCaster 
{ 
    template <typename U> 
    static T cast(U u); 
}; 


template <> 
struct AdditionalValueStaticCaster<void> 
{ 
    template <typename U> 
    static U cast(U u); 
}; 

現在我想寫的實現。這是確定:

template <typename T> 
template <typename U> 
T AdditionalValueStaticCaster<T>::cast(U u) 
{ 
    return static_cast<T>(u); 
} 

但是,這會導致錯誤error: too many template-parameter-lists

template<> 
template <typename U> 
U AdditionalValueStaticCaster<void>::cast(U u) 
{ 
    return u; 
} 

如果我刪除線template<>所有編譯好了,但我仍然有一個問題:是不是正確的解決方案或我錯過了什麼?

回答

3

如果我刪除行template<>所有編譯好的,但我仍然有問題:是正確的解決方案還是我錯過了什麼?

這是正確的,你只需要刪除該行。 AdditionalValueStaticCaster<void>是一個具體的類型,你只是提供該類型的成員函數模板的定義。因此:

template <typename U> 
U AdditionalValueStaticCaster<void>::cast(U u) 
{ 
    return u; 
} 

沒有比其他任何類類型的成員函數模板不同:

template <typename U> 
U SomeClass::cast(U u) 
{ 
    return u; 
} 
-2

我不認爲你可以定義在模板中的模板。 將所有模板參數放在第一個模板行中。喜歡這個。

template <typename T, typename U> 
struct AdditionalValueStaticCaster 
{ 
    static T cast(U u) 
    { 
     return static_cast<T>(u); 
    } 
}; 

專門到一個實際的對象是這樣的:

AdditionalValueStaticCaster< My_T_Type, My_U_Type> MyNewCaster; 

和這樣 My_T_Type My_T_Type_var使用; My_U_Type My_U_Type_var;

My_T_Type_var = MyNewCaster.cast(My_U_Type_var); 

對不起,我沒有一個編譯器來檢查這一點,但語法應該是關閉的。

+0

是的,你可以。你應該試試。 – Barry