亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何轉發聲明內部類?

如何轉發聲明內部類?

C++
一只名叫tom的貓 2019-10-28 14:42:26
我有這樣的課...class Container {public:    class Iterator {        ...    };    ...};在其他地方,我想通過引用傳遞Container :: Iterator,但是我不想包含頭文件。如果嘗試轉發聲明該類,則會出現編譯錯誤。class Container::Iterator;class Foo {    void Read(Container::Iterator& it);};編譯上面的代碼給出...test.h:3: error: ‘Iterator’ in class ‘Container’ does not name a typetest.h:5: error: variable or field ‘Foo’ declared voidtest.h:5: error: incomplete type ‘Container’ used in nested name specifiertest.h:5: error: ‘it’ was not declared in this scope我該如何轉發聲明該類,這樣就不必包括聲明Iterator類的頭文件了?
查看完整描述

3 回答

?
慕勒3428872

TA貢獻1848條經驗 獲得超6個贊

這根本不可能。您不能在容器外部轉發聲明嵌套結構。您只能在容器內轉發聲明。

您需要執行以下任一操作

  • 將課程設為非嵌套

  • 更改聲明順序,以便首先完全定義嵌套類

  • 創建一個既可以在函數中使用又可以由嵌套類實現的公共基類。


查看完整回答
反對 回復 2019-10-28
?
慕雪6442864

TA貢獻1812條經驗 獲得超5個贊

我不相信向前不完整的類作品聲明內部類的(因為沒有類定義,沒有辦法知道是否有實際的方式是一個內部類)。因此,您必須包含Container的定義,以及一個前向聲明的內部類:


class Container {

public:

    class Iterator;

};

然后在單獨的標頭中實現Container :: Iterator:


class Container::Iterator {

};

然后#僅包含容器標頭(或不必擔心前向聲明,只需將兩者都包含在內)


查看完整回答
反對 回復 2019-10-28
?
慕標5832272

TA貢獻1966條經驗 獲得超4個贊

我不知道完全按照自己的意愿進行操作,但是,如果您愿意使用模板,則可以采用以下解決方法:


// Foo.h  

struct Foo

{

   export template<class T> void Read(T it);

};

// Foo.cpp

#include "Foo.h"

#include "Container.h"

/*

struct Container

{

    struct Inner { };

};

*/

export template<> 

  void Foo::Read<Container::Inner>(Container::Inner& it)

{


}

#include "Foo.h"

int main()

{

  Foo f;

  Container::Inner i;

  f.Read(i);  // ok

  f.Read(3);  // error

}

希望該慣用法可能對您有所幫助(并希望您的編譯器基于EDG并實現export;))。


查看完整回答
反對 回復 2019-10-28
  • 3 回答
  • 0 關注
  • 441 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號