2013-05-09 86 views
7

我有以下嵌套模板什麼是定義嵌套模板的法律語法?

class A { 
    template <typename T> class B { 
     template <typename U> void foo(U arg); 
    }; 
}; 

我試圖定義,像這樣的嵌套模板:

template <typename T, typename U> void 
A::B<T>::foo(U arg) {...} 

但我得到declaration is incompatible with function template錯誤。這樣做的法律語法是什麼?

+3

你幾乎還不如干脆把它定義在那裏。它不能在一個單獨的文件中。 – chris 2013-05-09 20:05:36

+2

@chris:只是因爲它不能在一個單獨的翻譯單位並不意味着它不能在一個不同的文件。即使它必須位於同一個文件中,您仍然可以將實現與接口分開。 – 2013-05-09 20:11:25

+0

@MooingDuck,True,文件!= TU。我正在考慮更多地在通用鏈接文件中定義它。我自己也喜歡在類定義之外定義模板,這就是爲什麼我幾乎說過。我認爲OP將會走向第一個點,它會失敗。 – chris 2013-05-09 20:16:00

回答

10

你需要單獨的模板聲明:

template <typename T> 
template <typename U> 
void 
A::B<T>::foo(U arg) { … } 
+0

我試過了,但似乎也沒有工作 - 編譯器似乎將'T'與'U'混淆。我叫'arg.UMember()''中foo',但是編譯器會抱怨'一:: B 沒有成員UMember' – mchen 2013-05-09 20:09:01

+0

空括號調用默認構造,而不是初始化列表構造和本。今天是一個非常好的學習日子。 – chris 2013-05-09 20:09:26

+0

@MiloChen:http://coliru.stacked-crooked.com/view?id=4db49730dd7df44b6f01839277cc6c4f-50d9cfc8a1d350e7409e81e87c2653ba。 「U」模板之前是否有'T'模板? [他們必須以正確的順序。(http://coliru.stacked-crooked.com/view?id=0b98f6449a84341a2111b33f48a3536e-50d9cfc8a1d350e7409e81e87c2653ba) – 2013-05-09 20:13:10