[英]Nested classes are dependent types in class templates?
考慮以下:
template<class> struct T
{
struct T1
{
struct T2
{
};
};
/*typename*/ T1::T2 m;
};
沒有typename
,編譯將失敗,因為T2被視為從屬名稱,因此不是類型。 在考慮了C ++ 17草案標准(N4659)之后,我相信我已經確定了原因:
§17.6.2.1第5段
名稱是當前實例的成員,如果它是
—一種不合格的名稱,當查找時,該名稱指的是類的至少一個成員,該成員是當前實例或其非依賴基類。
...
名稱是當前實例的從屬成員,如果它是當前實例的成員,則在查找時,該成員指的是當前實例的類中的至少一個成員。
T1是當前實例的從屬成員。 T2不是當前實例的成員(它是T1的成員),
第17.6.2.1節9.3
類型是否依賴
...
—作為當前實例的從屬成員的嵌套類或枚舉,
...
T1是嵌套類,因此是從屬類型。
§17.6第3段
當qualified-id旨在引用不是當前實例(17.6.2.1)的成員的類型,並且其nested-name-specifier引用從屬類型時,應在其前面加上關鍵字typename ,從而形成一個typename-specifier 。 ...
因此,需要typename
。
我的理解正確嗎? 如果是這樣,這背后的原理是什么? 除了嵌套在T1中的T2之外,查找T1::T2
還能找到什么?
是的,你是對的。
在您的情況下,這無關緊要,因為如果不實例化m
(因為它是類成員),就不可能專門化T1
。 但是您可以這樣做,將m
放入函數中:
template<class> struct T
{
struct T1
{
struct T2
{
};
};
void foo() {
typename T1::T2 m;
}
};
template<>
struct T<void>::T1 {
int T2;
};
如果T1
不依賴,則您的代碼可能會更改含義,因為T2
將引用值而不是類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.