2013-04-16 32 views
1

我有一個模板結構:如何定義聲明的函數 - 具有未命名模板參數的模板結構成員?

template<typename T2, class, typename, class T3 = vec1<T2> > 
struct vec2 
{ 
    template<typename D2, class, typename, class D3> 
    void f14(int a); 

    template<typename D2, class, typename, class D3> 
    void f15(int a); 
}; 

我想定義,例如函數F15。我不知道,我應該在「??」的地方寫什麼。我試圖用不同的方式解決這個問題。但編譯器殺死了我編譯我的程序的夢想。

template<typename T2, class , typename , class T3> 
template<typename D2, class , typename , class D3> 
void vec2<T2,??,??,T3>::f15(int a) { } 

如何定義函數f15?

這樣的結構「class,typename」的學名是什麼? 我google了很多(「未命名的模板參數」等),但我沒有發現任何關於它。我想,它與具有未命名參數的函數相同。我想讀一些關於它的東西 - 從C++ standart或其他來源,但我不知道必要的信息在哪裏。

+0

聲明和實現之間的名稱不必匹配。 – Yakk

+0

爲什麼不直接命名你的當前未命名的類型以將它們作爲模板參數傳遞給vec2? – zakinster

+0

他們爲什麼沒有被命名? –

回答

5

您需要爲定義命名參數。

template <typename T2, class X, typename Y, class T3> 
template <typename D2, class X2, typename Y2, class D3> 
void vec2<T2, X, Y, T3>::f15<D2, X2, Y2, D3>(int a) { } 

一般有使用typenameclass定義的參數列表類型之間沒有真正的區別。唯一的區別是,當你定義一個模板模板參數時,你必須使用class

template <template <typename> class> struct A {}; 
//       ^^^^^ class is required here 

此外,當使用的是依賴型(從一個模板參數派生的類型),則必須使用typename來定義它。在this thread中有很好的解釋。

+0

我想補充一點,你必須命名它們的原因是:「當你省略這個名字時,你說你不需要這個參數,但在這種情況下,你需要它 - 指定特定的定義,所以你不能忽略名字。「 – Angew

+0

具有命名模板參數(僅限聲明)的結構是否與具有未命名結構參數的結構有區別,但具有已定義的函數f15:template void f15(int a){ }; –

+0

換句話說,如果我通過命名未命名的模板參數來移動這樣的struct/class等的函數定義,我是否會破壞程序的邏輯結構? –