C++ 模块:编译器报告多个定义

Pet*_*aus 5 c++ module visual-c++

我正在将 C++ 图形应用程序从头文件迁移到模块。循环依赖问题(C++ 模块和循环类引用)已初步解决。但现在我陷入了一个稍微复杂一点的境地。我有一个包含三个分区的模块:Part1、PartBase 和 PartDerived。其中两个参与者(PartBase 和 Part1)具有相互依赖关系,可以通过前向声明来解决。另外,PartBase和PartDerived有继承关系。实际情况当然更复杂,但这是一个精简的配置,我可以在其中重现该问题。

export module Module:Part1;

// :import PartBase would create circular dependency 
class PartBase;  // forward declaration is ok

export class Part1
{
    PartBase * pBase;
};


export module Module:PartBase;

import :Part1;

export class PartBase
{
    Part1 * pPart1;
};


export module Module:PartDerived;

import :PartBase;

export class PartDerived : public PartBase {};


export module Module;

export import :Part1;
export import :PartBase;
export import :PartDerived;
Run Code Online (Sandbox Code Playgroud)

该模块编译没有任何问题。但是,当从外部客户端模块引用模块中定义的类时

import Module;

export class Client
{
    PartDerived* pDerived;
    PartBase* pPartBase;
};
Run Code Online (Sandbox Code Playgroud)

编译器在使用 PartBase 的行中报告错误:

“导入模块‘Module’时出现不可恢复的错误:符号‘PartBase’已被定义”

我使用 Microsoft Visual Studio Community 2022(64 位)- 版本 17.3.3。

我无法解释此消息并怀疑它是编译器错误。但我了解到,在指责工具之前最好先找出自己的错误。有人有想法吗?

Gui*_*cot 1

看起来像是编译器错误,但确实很难验证,因为所有编译器都存在模块错误。

使用当前的编译器,我可以将前向声明导出为:Part1

export class PartBase;  // forward declaration is ok

export class Part1
{
    PartBase * pBase;
};
Run Code Online (Sandbox Code Playgroud)

实例