Все ли после экспортируемого пространства имен не экспортируется?

Я читал о модулях, и я хотел сделать что-то вроде этого:

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? Для циклической зависимости в реализации, нужно ли разбивать ее на другой файл?

16

Решение

От Рабочий проект, расширения до 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 сформировать зависимость циклического интерфейса.

2

Другие решения

Да, вы должны использовать отдельный файл реализации по крайней мере для одного из модулей (тот, который концептуально является «низкоуровневым»). ПДТС‘[dcl.module.import] / 3 говорит

Модуль M1 имеет зависимость интерфейса на модуле M2 если интерфейс модуля M1 содержит модуль-импорт-декларация выдвижению M2, Модуль не должен иметь транзитивной зависимости интерфейса от самого себя.

Это относится независимо от местоположения модуль-импорт-декларация, поскольку export может появляться где угодно и несколько раз в модуле интерфейса модуля. Правило предназначено для предотвращения появления типов и шаблонов из каждого из двух модулей в интерфейсе другого, поскольку тогда ни один из них не мог быть импортирован «первым».

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector