次のコードを検討してください。ベクトルのベクトルを 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;
}
文字列のベクトルを出力するステートメントは機能します。文字列のベクトルのベクトルを出力するものはそうではありません。g++ 4.7.0 を使用しています。-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>&&'
私はそれが何を意味するのか理解していないと思います。誰か説明してくれませんか?std::basic_ostream<char>
右辺値参照が何であるかは多かれ少なかれ知っていますが、なぜにバインドしないのかわかりませんstd::basic_ostream<char>&&
。よくわかっていないのではないでしょうか。そして、これを行うためのより良い方法はありますか?
前もって感謝します。