C++ 為什麼有時候必須額外寫 template?
this-&>x = result.template get&<0&>();
如上,我的get方法是個模板,結果就是有的時候必須在前面加個template,否則丫認不出來get是個模板。好難看……
這是為什麼?為啥有的時候又不用寫?==============另外為什麼我寫問題的時候,找不到「C++」話題,只有「C/C++」啊啊啊!這是人品問題么。。。
template是用來消除歧義的. 觀察下面的代碼:
template&
int f(T x) {
return x.template convert&<3&>(pi);
}
如果沒有template, 則
return x.convert&<3&>(pi);
可能被理解為
return ((x.convert) &< 3) &> (pi);
所以使用template來說明convert不是一個數據成員, 而是一個模板函數. 下面把標準照抄一遍.
使用 template 的規則
當成員模板特化的名字出現在一個後綴表達式中的.或-&>之後, 或者出現一個限定標識中的嵌套的名字修飾符之後, 並且後綴表達式或限定標識顯示依賴於一個模板參數時, 成員模板名字必須加template關鍵字作為前綴, 否則該名字就被假定為一個非模板的名字.
如果後綴表達式或者限定標識不是出現在一個模板的作用域時, 成員模板的名字就不應該加上template關鍵字作為前綴.
必須使用template的場合在通過「.」,「-&>」,「::」限定的依賴名訪問成員模板之前, template關鍵字必不可少.
template&
void f(T x, T y) {
int n = x.template convert&
int m = y-&>template convert&
}
template&
template&
struct dirived : other &
禁止使用template的場合
禁止用在模板之外的任何地方, 包括顯式(完全)模板特化. 禁止用在using聲明中.
要是不加template的話你怎麼知道"get&<0&>(1)"到底是"get&<0&>" "(1)"還是"get&<0" ">(1)"呢?在一個還沒實例化的模板里,你看見一個get又沒法確定它到底是什麼東西所以說D裡面不用尖括弧而用圓括弧還是有道理的,至少"("和")"肯定不是運算符
把自己想像成一個編譯器,當看到result.get&<0&>()這類玩意兒的時候在當前上下文上去分析result的類型,如果result的類型明確,就不用寫template,如果不明確(比如result的類型取決於模板參數的類型),那就需要寫template。typename也可以用同樣的方法。
當你的result的類型在上下文中不能唯一確定的時候,譬如說包含了「T",就要加template,不然後面的&<會被強行認為是小於號。
當然這是C++標準的要求,VC++有些時候你不寫他也會機智的認出來。我覺得這就跟&>&>一樣,還有那個巨蠢的調用模板父類函數一定要把父類類型寫出來的要求,以後省略這些也會成為C++標準的。
c++ - Where and why do I have to put the "template" and "typename" keywords?
namespace boost { int function = 0; }
int main() {
int f = 0;
boost::function&< int() &> f;
// boost::function(int變數) &<(小於) 0(int()相當於0) &>(大於) f;
}
2015-12-12
《C++ Templates: The Complete Guide》
5.1 Keyword typenameThe .template Construct9.3.3 Dependent Names of Templates
2016-04-21T16:23+08:00http://zhuanlan.zhihu.com/p/20029820----c++11里不是說優先將大於號小於號匹配成模版符號嗎?c++11里是不是不用寫template了?
get 0是什麼意思沒看明白 不應該是typename?
推薦閱讀:
※C++ 模版元編程對快速開發原型有何幫助?
※c++中虛析構函數如何實現多態的、內存布局如何?
※求一本或者幾本比較詳細介紹C++11的書,《C++ Primer》是否合適?
※看見網上說學單片機有助於c++的學習,是這樣的嗎?
TAG:C |