![](/img/trans.png)
[英]c++ explicit keyword cause compile error: template in template type cannot be resolved?
[英]Can `template` keyword qualifier cause code to compile successfully, but differently?
我正在閱讀模板關鍵字限定符( https://www.ibm.com/support/knowledgecenter/SSPSQF_9.0.0/com.ibm.xlcpp111.aix.doc/language_ref/keyword_template_qualifier.html ,以及我在哪里以及為什么必須把“模板”和“typename”關鍵字? ),但仍有一些讓我困惑的事情。
是否有可能成功編譯這樣的代碼,但會產生兩種不同的操作?
SomeObjectInstance.template some_function();
SomeObjectInstance.some_function();
是的,你可以寫出類似的東西,讓它形成良好,並給出不同的結果。 基本上你自己的例子:
#include <iostream>
struct foo {
template <int = 0>
void some_function() { std::cout << "template\n"; }
void some_function() { std::cout << "non-template\n"; }
};
int main(void) {
foo f{};
f.some_function();
f.template some_function();
return 0;
}
將打印您期望的 。 當編譯器看到第一次調用some_function
,它必須檢查它是否可以合成模板重載。 它可以,因為我們為模板參數提供了一個默認參數。 然后它會對兩個候選者進行重載解析, [over.match.best] / 1告訴我們
給定這些定義,可行函數F1被定義為比另一個可行函數F2更好的函數,如果對於所有自變量i,ICSi(F1)不是比ICSi(F2)更差的轉換序列,然后
- F1不是函數模板特化,F2是函數模板特化,或者,如果不是,
我們有兩個同樣好的隱式轉換序列(空),並且該子彈明確表示非模板版本是更好的候選者,因為其他一切都是相同的。
但是當使用template
關鍵字時,我們遵循[temp.names] / 5 :
以關鍵字模板為前綴的名稱應為template-id,或者名稱應引用類模板或別名模板。
模板ID在第1段中有這種語法生成:
simple-template-id: template-name < template-argument-list > template-id: simple-template-id operator-function-id < template-argument-list > literal-operator-id < template-argument-list >
template-argument-list在上述所有內容中都是可選的。 但精明的讀者會注意到尖括號未指定為可選。 似乎我們必須將模板成員函數命名為some_function<>
。 但幸運的是我們正在進行函數調用。 模板參數推斷正在發生,因此可以應用[temp.arg.explicit] / 3 :
...如果可以推導出所有模板參數,則可以省略它們; 在這種情況下,也可以省略空模板參數列表
<>
本身。 ...
所以我們確實可以寫f.template some_function();
,根據[temp.names] / 5,它必須引用一個模板。 這應該具有消除非模板過載的影響。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.