gpt4 book ai didi

c++ - 使用 std::copy 时, vector 上的 ostream 重载会引发错误

转载 作者:行者123 更新时间:2023-11-27 22:37:06 26 4
gpt4 key购买 nike

我想知道为什么以下编译失败:

#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 的行
  • 将 vector 更改为一维 vector (例如 std::vector<unsigned> data(5))。

关于 std::copy 的内容那是导致错误的原因?


使用 clion 调试,这是在 crbegin 中打印的嵌套 vector 的类型行:

enter image description here

最佳答案

因为你的operator<<std 不可见实体。

备注std::ostream_iterator<T>输出值 as if through operator<< ,并根据 [temp.dep.res]/1 :

In resolving dependent names, names from the following sources are considered:

  • Declarations that are visible at the point of definition of the template.
  • Declarations from namespaces associated with the types of the function arguments both from the instantiation context ([temp.point]) and from the definition context.

... 你的 operator<<std::ostream_iterator<T> 的定义点都不可见,也不在命名空间 std 中, 所以 operator<<用于 std::ostream_iterator<T>无法正确解决。

关于c++ - 使用 std::copy 时, vector 上的 ostream 重载会引发错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52902336/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com