C++ 为什么编译器不会停止在此模板代码上给出错误

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

我试图理解为什么这段代码会永久性地生成编译错误,因为我的理解是,模板专门化应该防止模板扩展在达到INDEX=0时进一步扩展,而这应该是代码中唯一的递归

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
,但它不起作用。