我正在努力解决 C++20 模块的 PIMPL 习惯用法。我正在使用一些第三方库,我不想将其暴露给库用户。我创建了以下要点来显示必要的文件:https://gist.github.com/mickes27/524e57c7fa95ac221be0b5ea8a9f4003。我正在使用 CMake,包含 CMakeLists.txt。我发现了几个问题:
我无法命名InternalPartition.ixx,因为我收到错误C7622:模块接口文件扩展名与'/module:internalPartition'不兼容,因为分区不是接口。我认为这是一些 MSVC 内部的东西,只有接口模块(带有导出关键字的模块可以有 .ixx 扩展名)。
当我在MyLibrary.cpp(模块实现单元)中导入InternalPartition时,出现错误MyLibrary.cpp(12):错误C2027:使用未定义类型'lib::Internal'。我假设(可能是错误的)在主模块接口单元中声明的类和在内部分区中定义的类是相同的并且应该是可见的(导入后)。
当我尝试在 MyLibrary.ixx 中删除前向声明和导入 InternalPartition 时,我得到: CMake 错误:公共 C++ 模块源 MyLibrary.ixx 需要 MyLibrary:InternalPartition C++ 模块,该模块由私有源 - 但我不想将内部分区作为公共模块的一部分,那么它是内部的有什么意义?
如果我尝试完全摆脱内部分区内容并将 InternalPartition.cpp 视为模块实现文件(module MyLibrary; 而不是 module MyLibrary:InternalPartition;),我们会回到 pt。 2 - 内部未在任何地方指定(无论我是否在 MyLibrary.ixx 中转发声明它)。
有人知道如何使用 PIMPL idiom + C++20 模块而不需要直接在 MyLibrary.cpp 中声明内部类吗?
在
InternalPartition.cpp
(我猜应该是.ixx
)中,您必须导出分区,并导出Internal
的定义,因此当MyLibrary.cpp
导入它时,它可以访问导出的类。
export module MyLibrary:InternalPartition;
...
export class Internal
...