C++ 为什么编译器不会停止在此模板代码上给出错误
我试图理解为什么这段代码会永久性地生成编译错误,因为我的理解是,模板专门化应该防止模板扩展在达到INDEX=0时进一步扩展,而这应该是代码中唯一的递归C++ 为什么编译器不会停止在此模板代码上给出错误,c++,tuples,template-specialization,C++,Tuples,Template Specialization,我试图理解为什么这段代码会永久性地生成编译错误,因为我的理解是,模板专门化应该防止模板扩展在达到INDEX=0时进一步扩展,而这应该是代码中唯一的递归 template <typename STREAM, typename TUPLE, std::size_t INDEX> struct streamer { STREAM &operator()(STREAM &out, const TUPLE &tuple) { streamer<STR
template <typename STREAM, typename TUPLE, std::size_t INDEX> struct streamer {
STREAM &operator()(STREAM &out, const TUPLE &tuple) {
streamer<STREAM, TUPLE, INDEX - 1U> stream;
return out << stream(out, tuple) << std::get<INDEX>(tuple);
}
};
template <typename STREAM, typename TUPLE> struct streamer<0> {
STREAM &operator()(STREAM &out, const TUPLE &tuple) {
return out << std::get<INDEX>(tuple);
}
};
template <typename STREAM, typename TUPLE>
STREAM &operator<<(STREAM &out, const TUPLE &tuple) {
streamer<STREAM, TUPLE, std::tuple_size<TUPLE>::value - 1U> stream;
return stream(out, tuple);
}
int main() {
std::tuple<std::string, std::string> a_guy("name", "surname");
std::cout << a_guy << std::endl;
return 0;
}
模板结构拖缆{
STREAM和operator()(STREAM和out、常量元组和元组){
流光流;
return out编译器告诉您,您的专门化中存在语法错误。此外,您的专门化中没有名为INDEX
的参数,这是另一个错误。正确的语法应该是:
template <typename STREAM, typename TUPLE> struct streamer<STREAM, TUPLE, 0> {
// ^^^^^^ ^^^^^
STREAM &operator()(STREAM &out, const TUPLE &tuple) {
return out << std::get<0>(tuple);
// ^^^
}
};
模板结构拖缆{
// ^^^^^^ ^^^^^
STREAM和operator()(STREAM和out、常量元组和元组){
返回请始终包含错误,否则在声明专门化时,您应该传递所有模板参数。struct streamer
应该是streamer
还请注意,专门化没有INDEX
参数。这就是为什么存在无止境的循环,始终选择第一个常规形式。谢谢这解决了主要问题,即无限循环。不幸的是,这段代码仍然不起作用,因为编译器抱怨std::tuple_size
:嵌套名称说明符流中使用的“std::tuple_size”类型不完整;
我尝试再次键入名称tuple
,但它不起作用。