爲什麼下面的代碼無效?使用模板參數作爲模板參數
template <typename S, typename T>
struct B{
void f(T t, S s) {t.f<S>(s); }
};
GCC 4.3.4抱怨說,它的「預期之前‘>’令牌主表達式」,即該「S」不是有效的基本表達式。
爲什麼下面的代碼無效?使用模板參數作爲模板參數
template <typename S, typename T>
struct B{
void f(T t, S s) {t.f<S>(s); }
};
GCC 4.3.4抱怨說,它的「預期之前‘>’令牌主表達式」,即該「S」不是有效的基本表達式。
你需要指定f
是一個模板:
void f(T t, S s) {
t.template f<S>(s);
}
C++不知道這(在這一點上),因爲f
的類型取決於模板參數T
的類型。此外,下面的語法不明確:<
是指模板列表或小於運算符的開始嗎?爲了幫助C++數字,你需要指定f
是一個模板,否則C++不能解析下面的部分,因爲解析自己取決於T
的類型。
您還可以依靠類型推斷來推斷模板類型,而不是明確指出它。然後你會得到「tf(s);」,它實際上是一種稍微更通用的方式來陳述它:你可能不關心f是一個模板函數,你只是希望它爲f定義一個接受S.
由於多態性,我認爲類型推斷在實際代碼中會失敗。 f看起來像模板 void f(S&),我想實例化f
VS可以解析它(懶惰解析?),它只是一個C++標準限制 – coyotte508 2011-09-21 14:10:46
@ coyotte508 VS使用雙路解析器來處理這個問題。這當然是可能的,但效率很低。標準中一次通過的限制很有意義,特別是考慮到計算機並不總是像現在一樣快,而C++編譯器仍然*速度很慢。 – 2011-09-21 15:36:30
這很瞭解。這不是GCC以這種方式表現的唯一實例(如果BaseClass是模板參數,它需要使用BaseClass :: function),所以personnally我不介意交易一些編譯時間,但我現在明白爲什麼限制。 – coyotte508 2011-09-21 15:52:00