2017-09-28 82 views
16

我閱讀有關的模塊,我希望做這樣的事情:是導出命名空間不導出後的一切嗎?

a.cpp

module foo.a; 

export namespace foo { 
    struct A { 
     void doA(); 
    }; 
} 

import foo.b; 
void foo::A::doA() { 
    B{}.doB(); 
} 

b.cpp

module foo.b; 

export namespace foo { 
    struct B { 
     void doB(); 
     void start(); 
    }; 
} 

import foo.a; 
import std.io; 
void foo::B::doB() { 
    std::cout << "Stuff done!" << std::endl; 
} 

void foo::B::start() { 
    A{}.doA(); 
} 

的main.cpp

import foo.b; 

int main() { 
    foo::B{}.start(); 
} 

由於模塊接口不能互相使用,爲了工作,導出後的所有內容編輯名稱空間不能是接口的一部分。根據當前的TS,以上是否正確?對於實現中的循環依賴性,是否需要將它分解爲另一個文件?

+0

您錯誤地將您的代碼標記爲c/C++。請將其標記爲Typescript。 – StarShine

+4

@StarShine - 你在做什麼? – StoryTeller

+0

模塊,據我所知,導入和語法如A {}。doA()是無效的C++。 – StarShine

回答

2

Working Draft, Extensions to C++ for Modules(在Experimental C++ Features實測值),第13頁,§10.7.2:3:

如果 M1模塊 接口包含一個模塊

模塊M1具有模塊M2上的一個接口的依賴進口申報M2。一個 模塊不應該有自己的傳遞接口依賴。

實施例:

// Interface unit of M1 
export module M1; 
import M2; 
export struct A { }; 

// Interface unit of M2 
export module M2; 
import M3; 

// Interface unit of M3 
export module M3; 
import M1; // error: cyclic interface dependency M3 -> M1 -> M2 -> M3 

問: 「對於在實施循環依賴性,是將其分割爲另一個文件它需要」 A:是的。


問:「根據當前TS是否上述正確?」答:不可以。不可以。不可以。不可以。不可以,不可以。不可以。不可以。不可以。不可以。不可以。不可以。不可以。不可以。

在代碼中,你有一個錯誤,因爲foo.afoo.b形式循環接口依賴

+0

所以界面是整個文件,而不僅僅是導出的東西。有趣。我想這是因爲必須編譯整個接口單元才能生成接口二進制文件。 –

+0

@GuillaumeRacicot:不,_interface_只是導出的項目(\ [dcl.module.interface]/1)。但是,它是受限制的接口_unit_。 –

+0

@DavisHerring啊是的,這就是我的意思。我還沒有使用所有這些新術語! –

1

是的,您必須爲至少一個模塊(概念上爲「低級」)使用單獨的實現文件。所述PDTS的[dcl.module.import]/3說

模塊M1具有模塊M2接口依賴如果M1模塊接口包含一個模塊導入聲明提名M2 。模塊本身不應具有傳遞接口依賴性。

這適用,而不管模塊導入聲明的位置,因爲export可以在任何地方出現,並且在一個模塊接口單元多次。該規則旨在防止在另一個模塊的界面中出現兩個模塊中的每個模塊的類型和模板,因爲這兩個模塊都不能「先導入」。

+1

您是否想引用PDTS的相關信息?這將使答案更完整。 –

+0

@GuillaumeRacicot:好的,完成了;不是gsamaras沒有先做。 –

+0

沒關係。您實際上添加了其他答案中缺少的一些信息。它使事情變得更清晰。我沒想過要重新開放出口。謝謝! –

相關問題