Ash*_*ley 4 c++ vector ostream
请考虑以下代码.我正在尝试将矢量向量输出到ostream.
#include <iterator>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
template<typename T>
std::ostream &operator <<(std::ostream &os, const std::vector<T> &v) {
using namespace std;
copy(v.begin(), v.end(), ostream_iterator<T>(os, "\n"));
return os;
}
int main() {
using namespace std;
vector<string> v1;
cout << v1;
vector<vector<string> > v2;
cout << v2;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我输出字符串向量的语句有效.我输出字符串向量向量的那个没有.我正在使用g ++ 4.7.0.我试过w /&w/o -std = c ++ 11标志.在C++ 11模式下,它在半页的错误中给出了这一行.
error: cannot bind 'std::ostream_iterator<std::vector<std::basic_string<char> >, char, std::char_traits<char> >::ostream_type {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
Run Code Online (Sandbox Code Playgroud)
我不认为我理解这意味着什么.有人可以向我解释一下吗?我或多或少知道rvalue引用是什么,但我不明白为什么std::basic_ostream<char>不绑定std::basic_ostream<char>&&.也许我不太了解它.还有更好的方法吗?
提前致谢.
你得到的错误有点误导.当我尝试编译你的程序时,我不得不深入挖掘模板呕吐物,我最终得到了我的想法:
error: no match for 'operator<<' in '*((std::ostream_iterator<std::vector<std::basic_string<char> >, char, std::char_traits<char> >*)this)->std::ostream_iterator<std::vector<std::basic_string<char> >, char, std::char_traits<char> >::_M_stream << __value'
Run Code Online (Sandbox Code Playgroud)
基本上,当您调用复制算法时,它使用输出迭代器,它使用命名空间std中的<<运算符.在那里,查找指示它试图在std命名空间中找到模板向量<>的重载(因为那是IT所在的位置).
所以你需要做的是在namespace std中为vector模板声明你的stream运算符.用你的代码包围namespace std {},看看会发生什么......
应该注意的是,你所做的基本上是修改std :: vector <>并为它添加以前不存在的行为.这样做是非标准的,未定义的,并且很容易妨碍你.您可以考虑其他选择.
我错了,这是一个koenig查找的东西.事实并非如此,问题是名称隐藏类似于类中出现的内容,您在基类中声明了某些内容的重载(而不是覆盖).
标准名称空间声明了几个"<<"运算符.这些基本上是命名的函数operator <<.从本质上讲,你拥有的是:
void fun(int);
namespace Test {
void fun() { fun(3); }
}
int main() {
Test::fun();
}
Run Code Online (Sandbox Code Playgroud)
请注意,您可以使用fun(int)全局命名空间或任何没有命名任何函数的命名空间fun.您无法在Test命名空间中使用它.
这就是为什么你使用operator << global全局命名空间而不是命名空间内的工作原理std.该std命名空间已经拥有的东西命名为同样的事情,你要提供,并让超载隐藏所有事情中的过载std.如果您可以使用声明,那么事情会有所不同.
| 归档时间: |
|
| 查看次数: |
12246 次 |
| 最近记录: |