2017-09-28 79 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

没关系。您实际上添加了其他答案中缺少的一些信息。它使事情变得更清晰。我没想过要重新开放出口。谢谢! –

相关问题