导出名称空间之后的所有内容都没有导出吗?

Is everything after an exporting namespace not exported?

我正在阅读有关模块的内容,我希望做这样的事情:

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,以上是否正确?实现中的循环依赖,是否需要拆分成另一个文件?

是的,您必须为至少一个模块(概念上 "lower-level" 的模块)使用单独的实现文件。 PDTS 的 [dcl.module.import]/3 表示

A module M1 has an interface dependency on a module M2 if the module interface of M1 contains a module-import-declaration nominating M2. A module shall not have a transitive interface dependency on itself.

无论 module-import-declaration 的位置如何,这都适用,因为 export 可以出现在模块接口单元中的任何地方和多次。该规则旨在防止两个模块中的每个模块的类型和模板出现在另一个模块的界面中,从那时起就无法导入 "first".

来自 工作草案,C++ 的扩展 模块 (在 Experimental C++ Features 中找到),第 13 页,§10.7.2:3:

A module M1 has an interface dependency on a module M2 if the module interface of M1 contains a module-import-declaration nominating M2. A module shall not have a transitive interface dependency on itself.

示例:

// 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

问:"For circular dependency in the implementation, is it required to split it into another file?"

答:是的。


问:"Is the above correct according to the current TS?"

答:没有

在你的代码中,你有一个错误,因为foo.afoo.b形成了一个循环接口依赖.