Я читал о модулях, и я хотел сделать что-то вроде этого:
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? Для циклической зависимости в реализации, нужно ли разбивать ее на другой файл?
От Рабочий проект, расширения до C ++ для
Модули (нашел в Экспериментальные особенности C ++), стр. 13, § 10.7.2: 3:
Модуль
M1
имеет интерфейсную зависимость от модуляM2
если модуль
интерфейсM1
содержит номинирование модуля-импорта-декларации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: Да.
Q: «Является ли вышеуказанное правильным в соответствии с текущим TS?»
A: Нет.
В вашем коде у вас есть ошибка, так как foo.a
а также foo.b
сформировать зависимость циклического интерфейса.
Да, вы должны использовать отдельный файл реализации по крайней мере для одного из модулей (тот, который концептуально является «низкоуровневым»). ПДТС‘[dcl.module.import] / 3 говорит
Модуль
M1
имеет зависимость интерфейса на модулеM2
если интерфейс модуляM1
содержит модуль-импорт-декларация выдвижениюM2
, Модуль не должен иметь транзитивной зависимости интерфейса от самого себя.
Это относится независимо от местоположения модуль-импорт-декларация, поскольку export
может появляться где угодно и несколько раз в модуле интерфейса модуля. Правило предназначено для предотвращения появления типов и шаблонов из каждого из двух модулей в интерфейсе другого, поскольку тогда ни один из них не мог быть импортирован «первым».