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,上述是否正确?对于实现中的循环依赖,是否需要将其拆分为另一个文件?
从工作草案中,\n模块的 C++ 扩展(可在实验性 C++ 功能中找到),第 13 页,\xc2\xa710.7.2:3:
\n\n\n\n\n如果模块的接口包含模块导入声明提名,则模块具有对模块的
\nM1接口依赖性。模块不应具有对其自身的传递接口依赖性。M2M1M2
例子:
\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\nRun Code Online (Sandbox Code Playgroud)\n\nQ:“实现中出现循环依赖,是否需要拆分到另一个文件中?”
\n\n答:是的。
\n\n问:“根据当前的 TS,上述内容是否正确?”
\n\n答:没有。
\n\n在您的代码中,您有一个错误,因为foo.a和foo.b形成了循环接口依赖关系。