簡體   English   中英

嵌套類是類模板中的依賴類型嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM