簡體   English   中英

C ++中的嵌套子類

[英]Nested subclasses in C++

我正在嘗試創建一個嵌套類,它也是其父類的子類:

struct X { struct Y : public X {}; };

不幸的是,在C ++中似乎不允許這樣做,因為g ++會產生錯誤

錯誤:無效使用不完整類型'struct X'

但是,我的實際代碼將X作為模板類:

template<typename T> struct X
{ struct Y : public X {}; };

我收到相同的消息,但這次只是一個警告:

警告:無效使用不完整類型'struct X <T>'

我的問題是:為什么前一種情況是非法的,而模板化的案例只是發出警告? 模板化版本的工作方式完全符合我的預期(我可以創建X<T>::Y實例,將它們轉換為X<T> ,依此類推)但警告意味着我不應該使用它? 如果忽略警告,我可能會遇到什么問題?

回答基本問題:你得到一個警告,因為模板還沒有實例化,所以它不會打擾任何人。

在這兩種情況下,修復此問題的方法是在X的布局已知的位置定義X::Y ,因此可以正確推導出Y的布局。 你可以這樣做:

struct X { struct Y; }
struct X::Y {};

從技術上講,就編譯器而言,在模板( X )實例化之前,不需要知道基礎( X )的布局。 並且模板( X )在完全定義之前可能無法實現。 在這一點上,它的布局是已知的。

從模板中獲取錯誤的最簡單方法是在X嘗試istantiate Y

template<typename T> struct X {
    struct Y : public X {};
    Y y;
};

在編譯器的早期版本中,在您顯示的情況下沒有警告,但是在某些時候添加了它。 以下是GCC漏洞追蹤者關於該警告是否是虛假的討論。 標准是否允許這樣做存在一些不確定性,但他們的結論是不允許這樣做。

因此,標准不允許任何情況,但GCC繼續與后者合作,因為它可以。

Yam Marcovic演示如何以符合標准的方式定義X::Y gcc bugtracker中顯示了類似的相同示例。

暫無
暫無

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

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