编译Glow编译器时遭遇C++数据类型不匹配错误求助
编译Glow时
expectCompareTrue模板类型推导冲突错误的解决方法 环境信息
- 系统:MacOS 12.4(Intel处理器)
- 编译器:Apple clang version 13.1.6 (clang-1316.0.21.2.5)
编译错误详情
/Users/dhruva_macintosh/Calligo/glow/lib/Graph/Nodes.cpp:2252:14: error: no matching function for call to 'expectCompareTrue' isValid &= expectCompareTrue( ^~~~~~~~~~~~~~~~~ /Users/dhruva_macintosh/Calligo/glow/include/glow/Graph/VerifierHelper.h:126:6: note: candidate template ignored: deduced conflicting types for parameter 'InputTy' ('unsigned long' vs. 'unsigned long long') bool expectCompareTrue( ^ /Users/dhruva_macintosh/Calligo/glow/include/glow/Graph/VerifierHelper.h:154:6: note: candidate template ignored: could not match 'ArrayRef<type-parameter-0-0>' against 'unsigned long long' bool expectCompareTrue( ^ 1 error generated. make[2]: *** [lib/Graph/CMakeFiles/Graph.dir/Nodes.cpp.o] Error 1 make[1]: *** [lib/Graph/CMakeFiles/Graph.dir/all] Error 2 make: *** [all] Error 2
问题原因
MacOS平台上size_t被定义为unsigned long,但代码中对应位置的另一参数类型为unsigned long long,导致模板函数expectCompareTrue进行参数推导时出现类型冲突,编译器无法匹配到合适的重载版本。
解决方法
方法1:显式指定模板参数
找到Nodes.cpp第2252行的expectCompareTrue调用,显式指定统一的模板参数类型,示例:
// 根据实际参数类型选择unsigned long或unsigned long long isValid &= expectCompareTrue<unsigned long long>(/* 原参数列表 */);
方法2:强制类型转换
将冲突的其中一个参数转换为匹配的类型,消除推导冲突,示例:
// 假设param1为unsigned long类型,param2为unsigned long long类型 isValid &= expectCompareTrue(static_cast<unsigned long long>(param1), param2, /* 其他参数 */);
方法3:全局修复模板函数
修改VerifierHelper.h,添加支持不同类型参数的重载模板,利用std::common_type_t自动推导公共类型:
#include <type_traits> // 添加新的重载模板 template<typename InputTy1, typename InputTy2> bool expectCompareTrue(VerifierHelper &verifier, llvm::StringRef msg, InputTy1 val1, InputTy2 val2, llvm::StringRef lhsName = "", llvm::StringRef rhsName = "") { using CommonTy = std::common_type_t<InputTy1, InputTy2>; return expectCompareTrue<CommonTy>(verifier, msg, static_cast<CommonTy>(val1), static_cast<CommonTy>(val2), lhsName, rhsName); }
内容的提问来源于stack exchange,提问作者Dhruva Sundararajan
相关产品推荐
相关产品推荐

