[英]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::Anested
, A
是當一個不完整的類型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.