![](/img/trans.png)
[英]Elaborated-type-specifier for a scoped enum must not use the ‘class’ keyword
[英]type-dependent nested-name-specifier in elaborated-type-specifier
在這個問題之前,我從未在詳細說明類型說明符中看到過嵌套名稱說明符,乍一看我認為它甚至沒有被語法覆蓋。 現在我看到,從C ++ 98到現在,它被翻譯為沒有typename-specifier結構的特殊情況。 C ++ 11 7.1.6.3/2(C ++ 98中的7.1.5.3/2):
3.4.4描述了如何在詳細類型說明 符中對標識符進行名稱查找。 如果標識符解析為類名或枚舉名 ,則elaborated-type-specifier將它引入聲明,就像simple-type-specifier引入其類型名一樣 。
因此,雖然您可以形成一個合格的詳細類型說明符,但您需要注意它從不依賴於類型。 在模板定義時,每3.4.4的名稱解析將永遠不會找到類名,因為除非前綴為typename
關鍵字,否則依賴名稱將被假定為對象,在此上下文中不允許使用語法。
這是對標准含義和語言設計意圖的准確評估嗎?
從評論中擴展:
以此程序為例:
template <typename T>
struct S1 { struct I { }; };
template <typename T>
struct S2 { typedef struct S1<T>::I I; }; // okay
template <typename T>
struct S3 { typedef struct S2<T>::I I; }; // okay at definition time
// usually error at instantiation time
template <>
struct S2<short> : S1<short> { };
int main() {
S1<int>::I a;
S2<int>::I &b = a; // okay
S3<int>::I &c = b; // error
S1<short>::I d;
S2<short>::I &e = d; // okay
S3<short>::I &f = e; // okay
}
在模板定義時, S2
和S3
都可以:14.6p5列出了不需要typename
的異常。 基本上:在使用明確的地方,因為名稱永遠不能是類型以外的任何名稱,因此不需要typename
。 這包括幾種在語法上不允許使用typename
情況,因此需要typename
意味着無法編寫程序。 typename struct S<T>::I
和struct typename S<T>::I
都是硬錯誤, struct S<T>::I
是明確的。
在模板實例化時,3.4.4的規則更清楚: struct S1<int>::I
和struct S2<int>::I
然后可以找到,其中很明顯S2<int>::I
是一個typedef,所以struct S2<int>::I
是一個錯誤。 同時,在那時, S2<short>::I
被認為不是typedef,而是一個struct,所以struct S2<short>::I
是允許的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.