为什么编译器不会停止在此模板代码上给出错误
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;
}
请注意,问题不是关于"如何打印元组",因为已经有很多。问题是关于为什么这个特定的代码不起作用,特别是为什么它使编译器永远循环。
你的专业化有语法错误,这是编译器告诉你的。此外,您的专业化中没有名为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);
.
相关文章:
- 将鼠标悬停在问题上时与预期">"相关的代码错误
- VI工作室代码错误无法打开输出文件主.exe
- 引入参数化构造函数后显示 LNK 2019 未解析外部符号的代码错误
- 有关矩阵的代码错误导致分段错误(内核转储)
- C++ Schannel POST 400 错误代码错误请求
- Java 本机访问代码错误:"Invalid memory access"
- 代码错误修改
- C++代码错误分配
- "_FCbuild"不能用作函数 - C/C++ 代码错误
- 我的代码错误类型警告 1 警告 C4018 和更多错误
- 代码错误(从 1 到 100 找到质数)
- OpenCV VisualStudio,C 代码错误尝试访问像素
- 当我使用的教程完全没有错误时,为什么我的代码错误
- 简单的NOOB C 输入/输出问题:代码错误
- 为什么enumProcessModules返回false值和299代码错误
- WinhttpSetoption()失败设置TLSV1.2,带有错误代码错误_internet_incorrect_ha
- 苹果安全传输代码错误
- C++ - 国际象棋主教移动代码错误
- 导入Python库时,嵌入了Python代码错误
- 编译提升C 代码错误