【发布时间】:2026-01-13 02:00:02
【问题描述】:
我想知道为什么以下编译失败:
#include <vector>
#include <ostream>
#include <iterator>
#include <algorithm>
#include <iostream>
template <template <typename...> class Container, class T>
std::ostream& operator<<(std::ostream& oss, const Container<T>& c) {
oss << "[";
std::copy(std::cbegin(c), std::prev(std::cend(c)), std::ostream_iterator<T>(oss, ","));
return oss << (*std::crbegin(c)) << "]";
}
auto main() -> int {
std::vector<std::vector<unsigned>> data(5);
std::cout << data << std::endl;
return 0;
}
http://coliru.stacked-crooked.com/a/431617423f92ba4e
当我执行以下一个时,它编译得很好:
- 删除带有
std::copy的行 - 将向量更改为一维向量(例如
std::vector<unsigned> data(5))。
导致错误的std::copy 是什么?
使用 clion 进行调试,这是在 crbegin 行中打印的嵌套向量的类型:
【问题讨论】:
-
另外,您似乎正试图在
std::vector<unsigned>上调用<<,并且不存在重载。 -
@PaulMcKenzie,如果我删除
std::copy行,它编译得很好 -
template <typename...> class Container就在这行,里面只能放一个容器,里面有两个std::vector<std::vector<unsigned>>! -
@smac89 因为容器无法从 ostream 中的
std::vector<std::vector<unsigned>>复制std::vector<unsigned>... -
@Ruks,我认为这不是问题所在。重载绝对匹配嵌套向量。问题是当它尝试使用
std::copy打印内容时
标签: c++ stream operator-overloading c++14