导出命名空间后的所有内容都未导出吗?

Gui*_*cot 16 c++ circular-dependency language-lawyer c++-modules

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

a.cpp

module foo.a;

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

import foo.b;
void foo::A::doA() {
     B{}.doB();
}
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)

main.cpp中

import foo.b;

int main() {
    foo::B{}.start();
}
Run Code Online (Sandbox Code Playgroud)

由于模块接口不能互相使用,为了使其工作,导出的命名空间之后的所有内容都不能成为接口的一部分.根据目前的TS,上述是否正确?对于实现中的循环依赖,是否需要将其拆分为另一个文件?

gsa*_*ras 2

工作草案中,\n模块的 C++ 扩展(可在实验性 C++ 功能中找到),第 13 页,\xc2\xa710.7.2:3:

\n\n
\n

如果模块的接口包含模块导入声明提名,则模块具有对模块的M1接口依赖性。模块不应具有对其自身的传递接口依赖性。M2M1M2

\n
\n\n

例子:

\n\n
// Interface unit of M1\nexport module M1;\nimport M2;\nexport struct A { };\n\n// Interface unit of M2\nexport module M2;\nimport M3;\n\n// Interface unit of M3\nexport module M3;\nimport M1; // error: cyclic interface dependency M3 -> M1 -> M2 -> M3\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

Q:“实现中出现循环依赖,是否需要拆分到另一个文件中?”

\n\n

答:是的。

\n\n
\n\n

问:“根据当前的 TS,上述内容是否正确?”

\n\n

答:没有。

\n\n

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

\n