模块中简单类引发C2665错误:跨项目构造函数匹配失败
问题:C++模块中调用SecondClass构造函数触发C2665错误
我正在学习C++模块与类的使用,编写了包含FirstClass和SecondClass的模块代码,模块编译正常。但在另一个项目中调用SecondClass sec(firstCl)时,触发了C2665错误,提示无法匹配构造函数参数,即使显式删除相关构造函数也无效。
模块代码
firstFile.cpp
export module ModTest; export import :Two; export class FirstClass { public: FirstClass(); int firstClassFunc(); };
firstFile_impl.cpp
module ModTest; int FirstClass::firstClassFunc() { return 8; } FirstClass::FirstClass() { SecondClass sec(this); }
secondFile.cpp
export module ModTest:Two; class FirstClass; export class SecondClass { public: SecondClass(FirstClass *parent){} SecondClass(const SecondClass&) noexcept = delete; SecondClass(const SecondClass&&) noexcept = delete; SecondClass& operator=(const SecondClass&) noexcept = delete; SecondClass& operator=(SecondClass&&) noexcept = delete; };
调用代码
FirstClass *firstCl = new FirstClass(); SecondClass sec(firstCl);
错误信息
1>C:\ecworks_mep\_WINOHNEDLL\src\mainframe.cpp(358,17): error C2665: 'SecondClass::SecondClass': no overloaded function could convert all the argument types 1>(compiling source file '../src/mainframe.cpp') 1> C:\ecworks_mep\moduleTest\moduleTest\secondFile.cpp(9,2): 1> could be 'SecondClass::SecondClass(const SecondClass &&) noexcept' 1> C:\ecworks_mep\_WINOHNEDLL\src\mainframe.cpp(358,17): 1> 'SecondClass::SecondClass(const SecondClass &&) noexcept': cannot convert argument 1 from 'FirstClass *' to 'const SecondClass &&' 1> C:\ecworks_mep\_WINOHNEDLL\src\mainframe.cpp(358,18): 1> Reason: cannot convert from 'FirstClass *' to 'const SecondClass' 1> C:\ecworks_mep\moduleTest\moduleTest\secondFile.cpp(8,2): 1> or 'SecondClass::SecondClass(const SecondClass &) noexcept' 1> C:\ecworks_mep\_WINOHNEDLL\src\mainframe.cpp(358,17): 1> 'SecondClass::SecondClass(const SecondClass &) noexcept': cannot convert argument 1 from 'FirstClass *' to 'const SecondClass &' 1> C:\ecworks_mep\_WINOHNEDLL\src\mainframe.cpp(358,18): 1> Reason: cannot convert from 'FirstClass *' to 'const SecondClass' 1> C:\ecworks_mep\moduleTest\moduleTest\secondFile.cpp(7,2): 1> or 'SecondClass::SecondClass(FirstClass *)' 1> C:\ecworks_mep\_WINOHNEDLL\src\mainframe.cpp(358,17): 1> 'SecondClass::SecondClass(FirstClass *)': cannot convert argument 1 from 'FirstClass *' to 'FirstClass *' 1> C:\ecworks_mep\_WINOHNEDLL\src\mainframe.cpp(358,18): 1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or parenthesized function-style cast 1> C:\ecworks_mep\_WINOHNEDLL\src\mainframe.cpp(358,17): 1> while trying to match the argument list '(FirstClass *)' 1>Done building project "mepOhneDll4.vcxproj" -- FAILED.
问题原因及修复
核心原因
编译器将两个上下文里的FirstClass判定为无关类型:
- 在模块分区
:Two中,仅前向声明了class FirstClass;,但未导出这个前向声明; - 主模块
ModTest导出了完整的FirstClass类; - 外部项目调用构造函数时,看到的
FirstClass*是主模块导出的完整类型,而SecondClass构造函数参数里的FirstClass*对应:Two分区未导出的前向声明类型,二者被编译器视为完全不同的类型,因此无法匹配构造函数。
修复方案
在:Two分区中导出FirstClass的前向声明,确保外部代码看到的FirstClass类型与SecondClass构造函数参数的类型一致:
修改secondFile.cpp:
export module ModTest:Two; export class FirstClass; // 新增export导出前向声明 export class SecondClass { public: SecondClass(FirstClass *parent){} SecondClass(const SecondClass&) noexcept = delete; SecondClass(const SecondClass&&) noexcept = delete; SecondClass& operator=(const SecondClass&) noexcept = delete; SecondClass& operator=(SecondClass&&) noexcept = delete; };
修改后,外部代码中的FirstClass*与SecondClass构造函数参数的类型完全匹配,错误即可解决。
内容的提问来源于stack exchange,提问作者mael15
相关产品推荐
相关产品推荐

