簡體   English   中英

C++ 為什么模板化一個類會解決未定義的類錯誤

[英]C++ why templating a class resolves undefined class error

當我嘗試使用外部類類型的成員聲明嵌套類時遇到編譯器錯誤:

class A {
public:
    class Anested {
        A a; // Error: 'A::Anested::a' uses undefined class 'A'
    };
};

將外部類更改為類模板會消除編譯器錯誤:

template <size_t n>
class B {
public:
    class Bnested {
        B b; // Fine
    };
};

int main() {
    B<0> b; // Fine
    B<0>::Bnested bn; // Fine
}

為什么應該允許一個聲明而不允許另一個聲明,特別是因為在上面的例子中模板參數完全是任意的? 如果有任何區別,我正在使用帶有 C++14 語言標准的 MSVC 進行編譯。

在的情況下, A::AnestedA是當一個不完整的類型a聲明,編譯器還沒有看到整個聲明A還沒有,所以它不能宣布a作為實例A 不完整類型僅在處理引用和指針時有效。

B::Bnested的情況下,模板在多個階段進行處理。 編譯器在聲明b時知道B<n>存在,但它還不知道n的實際值,因此它尚未實例化b 當后來代碼實例化的一個實例B<n>與實際參數n ,編譯器將知道隨后的完整類型B<n>並且可以實例化b與相同的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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