Форвардное объявление во фрагменте глобального модуляC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Форвардное объявление во фрагменте глобального модуля

Сообщение Anonymous »

У меня есть класс template Monomial и класс template Polynomial. Polynomial владеет std::map. Я хотел бы создать функцию-член Monomial, которая возвращает Polynomial. Чтобы избежать циклической зависимости, я попытался сделать следующее:
Monomial.ixx

Код: Выделить всё

export module Polynomial:Monomial;

template class Polynomial;

export template class Monomial
{
public:
Polynomial getPolynomial() const;
};
Polynomial.ixx

Код: Выделить всё

export module Polynomial:Polynomial;

import :Monomial;

export template class Polynomial
{
private:
std::map terms;
};
MonomialToPolynomial.ixx

Код: Выделить всё

export module Polynomial:MonomialToPolynomial;

import :Polynomial;
import :Monomial;

template Polynomial Monomial::getPolynomial() const
{
return Polynomial({ { *this, 1.0 } });
}
PolynomialModule.ixx

Код: Выделить всё

export module Polynomial;

export import :Polynomial;
export import :Monomial;
export import :MonomialToPolynomial;
Однако это не работает. Если я попытаюсь использовать эту функцию как:

Код: Выделить всё

import Polynomial;

Monomial m = Monomial();
Polynomial p = m.toPolynomial();
При компиляции в Visual Studio 2022 (MSVC) я получаю ошибку C2027: использование неопределенного типа «Polynomial». Почему это не работает?
Я нашел обходной путь, но не уверен, что он действует. Я пишу Monomial.ixx как:

Код: Выделить всё

module;

template class Polynomial;

export module Polynomial:Monomial;

export template class Monomial
{
public:
Polynomial getPolynomial() const;
};

template Polynomial Monomial::getPolynomial() const
{
return Polynomial({ { *this, 1.0 } });
}
Здесь я пересылаю объявленный Polynomial во фрагменте глобального модуля Monomial.ixx, а также определяю функцию в этом файле. Polynomial.ixx остался прежним, и MonomialToPolynomial с соответствующим разделом модуля больше не нужен. Это компилируется и все работает правильно. Почему это работает? При этом появляется предупреждение C5202: фрагмент глобального модуля может содержать только директивы препроцессора. Это допустимое решение? Есть ли альтернативный способ сформулировать это без необходимости предварительного объявления во фрагменте глобального модуля.


Подробнее здесь: https://stackoverflow.com/questions/798 ... e-fragment
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»