標籤:

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& struct other;
template&
struct dirived : other &::template base& {};

禁止使用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 typename

The .template Construct

9.3.3 Dependent Names of Templates

2016-04-21T16:23+08:00

http://zhuanlan.zhihu.com/p/20029820

----


c++11里不是說優先將大於號小於號匹配成模版符號嗎?c++11里是不是不用寫template了?


get 0是什麼意思沒看明白 不應該是typename?


推薦閱讀:

C++ 模版元編程對快速開發原型有何幫助?
c++中虛析構函數如何實現多態的、內存布局如何?
求一本或者幾本比較詳細介紹C++11的書,《C++ Primer》是否合適?
看見網上說學單片機有助於c++的學習,是這樣的嗎?

TAG:C |