为什么编译器不会停止在此模板代码上出错
Why compiler will not stop giving errors on this template code
我试图理解为什么这段代码会永久产生编译错误,据我所知,模板特化应该防止模板扩展在达到 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;
}
请注意问题与 "how to print a tuple" 无关,因为已经有很多问题了。问题是为什么这段特定代码不起作用,特别是为什么它会使编译器永远循环。
你的专业化有语法错误,这是编译器告诉你的。此外,您的专业化中没有名为 INDEX
的参数,这是另一个错误。正确的语法应该是:
template <typename STREAM, typename TUPLE> struct streamer<STREAM, TUPLE, 0> {
// ^^^^^^ ^^^^^
STREAM &operator()(STREAM &out, const TUPLE &tuple) {
return out << std::get<0>(tuple);
// ^^^
}
};
您的代码还有一个问题:
return out << stream(out, tuple) << std::get<INDEX>(tuple);
这会调用 operator<<(std::ostream&, std::ostream&)
,它不存在,但无论如何也不需要。只需使用 return stream(out, tuple) << std::get<INDEX>(tuple);
.
我试图理解为什么这段代码会永久产生编译错误,据我所知,模板特化应该防止模板扩展在达到 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;
}
请注意问题与 "how to print a tuple" 无关,因为已经有很多问题了。问题是为什么这段特定代码不起作用,特别是为什么它会使编译器永远循环。
你的专业化有语法错误,这是编译器告诉你的。此外,您的专业化中没有名为 INDEX
的参数,这是另一个错误。正确的语法应该是:
template <typename STREAM, typename TUPLE> struct streamer<STREAM, TUPLE, 0> {
// ^^^^^^ ^^^^^
STREAM &operator()(STREAM &out, const TUPLE &tuple) {
return out << std::get<0>(tuple);
// ^^^
}
};
您的代码还有一个问题:
return out << stream(out, tuple) << std::get<INDEX>(tuple);
这会调用 operator<<(std::ostream&, std::ostream&)
,它不存在,但无论如何也不需要。只需使用 return stream(out, tuple) << std::get<INDEX>(tuple);
.