2010-06-10 133 views
2

爲什麼下面的代碼無效?使用模板參數作爲模板參數

template <typename S, typename T> 
struct B{ 
    void f(T t, S s) {t.f<S>(s); } 
}; 

GCC 4.3.4抱怨說,它的「預期之前‘>’令牌主表達式」,即該「S」不是有效的基本表達式。

回答

12

你需要指定f是一個模板:

void f(T t, S s) { 
    t.template f<S>(s); 
} 

C++不知道這(在這一點上),因爲f的類型取決於模板參數T的類型。此外,下面的語法不明確:<是指模板列表或小於運算符的開始嗎?爲了幫助C++數字,你需要指定f是一個模板,否則C++不能解析下面的部分,因爲解析自己取決於T的類型。

+0

VS可以解析它(懶惰解析?),它只是一個C++標準限制 – coyotte508 2011-09-21 14:10:46

+0

@ coyotte508 VS使用雙路解析器來處理這個問題。這當然是可能的,但效率很低。標準中一次通過的限制很有意義,特別是考慮到計算機並不總是像現在一樣快,而C++編譯器仍然*速度很慢。 – 2011-09-21 15:36:30

+0

這很瞭解。這不是GCC以這種方式表現的唯一實例(如果BaseClass是模板參數,它需要使用BaseClass :: function),所以personnally我不介意交易一些編譯時間,但我現在明白爲什麼限制。 – coyotte508 2011-09-21 15:52:00

1

您還可以依靠類型推斷來推斷模板類型,而不是明確指出它。然後你會得到「tf(s);」,它實際上是一種稍微更通用的方式來陳述它:你可能不關心f是一個模板函數,你只是希望它爲f定義一個接受S.

+0

由於多態性,我認爲類型推斷在實際代碼中會失敗。 f看起來像模板 void f(S&),我想實例化f (Child&),這在示例代碼中是不清楚的。 – 2010-06-11 20:39:14