编译Silo遇operator<<匹配错误,求Debian 12下正确编译方法
编译Silo时的operator<<匹配错误解决办法
编译Silo过程中触发如下编译错误:
error: no match for ‘operator<<’ (operand types are ‘std::ostringstream’ {aka ‘std::__cxx11::basic_ostringstream<char>’} and ‘std::pair<const std::__cxx11::basic_string<char>, long unsigned int>’) 319 | ss << *begin++; | ~~~^~~~~~~~~~~
错误出自./util.h文件中的format_list模板函数,相关代码片段如下:
template <typename ForwardIterator> std::string format_list(ForwardIterator begin, ForwardIterator end) { std::ostringstream ss; ss << "["; bool first = true; while (begin != end) { if (!first) ss << ", "; first = false; ss << *begin++; // 错误触发行 } ss << "]"; return ss.str(); }
当前编译环境为Debian 12@Linux 5.15.19,以下是可行的编译修复方案:
问题原因
C++标准库并未提供std::pair类型的默认operator<<输出重载,当format_list模板被用于遍历std::pair类型元素时,编译器无法找到对应的输出操作符,因此报错。这属于Silo代码的兼容性问题。
修复方案
方案一:全局添加std::pair的operator<<重载
在util.h文件的开头(确保包含必要头文件后)添加以下代码,为所有std::pair类型提供输出支持:
#include <utility> #include <ostream> template <typename T1, typename T2> std::ostream& operator<<(std::ostream& os, const std::pair<T1, T2>& p) { os << "(" << p.first << ", " << p.second << ")"; return os; }
方案二:修改format_list模板适配std::pair
如果不想全局重载操作符,可以在format_list中针对std::pair类型做特殊处理,修改后的代码如下:
#include <type_traits> #include <utility> #include <string> template <typename ForwardIterator> std::string format_list(ForwardIterator begin, ForwardIterator end) { std::ostringstream ss; ss << "["; bool first = true; while (begin != end) { if (!first) ss << ", "; first = false; using ValueType = typename std::iterator_traits<ForwardIterator>::value_type; // 针对当前报错的pair类型做处理,也可扩展为通用pair支持 if constexpr (std::is_same_v<ValueType, std::pair<const std::string, size_t>>) { const auto& pair_val = *begin++; ss << "(" << pair_val.first << ", " << pair_val.second << ")"; } else { ss << *begin++; } } ss << "]"; return ss.str(); }
方案三:使用兼容的旧版编译器
Silo是较早的项目,可能基于旧版GCC开发。可以安装GCC 8版本并指定编译器编译:
sudo apt update && sudo apt install gcc-8 g++-8 export CC=gcc-8 CXX=g++-8 make clean && make
内容的提问来源于stack exchange,提问作者Miya
相关产品推荐
相关产品推荐

