C++20 Module分离声明与实现时VS2022编译失败问题咨询
问题原因分析
你的编译错误是多个语法和模块规则使用错误共同导致的,具体如下:
- 模块单元声明错误:
AMemberFunc.cppm中的module MemberFunc;声明了一个全新的独立模块MemberFunc,并非你需要的AStruct模块的实现单元。如果你要为AStruct模块中声明的类成员写外部定义,应该将该行改为module AStruct;,此时当前翻译单元作为AStruct的实现单元,可以直接访问AStruct模块内的所有可见符号,包括其通过export import引入的FuncEnumNum模块的导出内容。 - 成员函数定义语法错误:你在
AMemberFunc.cppm中写的int MemberFunc()是全局函数定义,而非类A的成员函数实现,正确写法为int A::MemberFunc()。 - 显式导入缺失(可选,仅当你坚持使用独立
MemberFunc模块时需要):如果你确实需要把成员函数定义放在独立的MemberFunc模块下,那么你需要在AMemberFunc.cppm中额外添加import FuncEnumNum;语句,才能访问到num、MyFunc、HwColors这些属于FuncEnumNum模块的导出符号。 - 笔误错误:
AMemberFunc.cppm中if( hwColors == HwColors::YELLOW ) OK行的OK是多余内容,属于语法错误,也会导致编译失败。
另外补充你对模块理解的偏差:导入模块接口后确实能看到该模块所有导出的声明,但仅作用于当前导入语句所在的翻译单元/模块作用域,不会跨未关联的独立模块自动传递。
内容的提问来源于stack exchange,提问作者rtischer8277
相关产品推荐
相关产品推荐

