STL コンテナーをきれいに印刷しようとしています。私がしようとしているのは、区切り記号で区切られたコンテナの要素を出力することです。しかし、私はいくつかの問題に遭遇しました。
1. g++ と VC++
ostream& operator<<(ostream& o, const vector<string>& v) {
copy(v.begin(), v.end(), std::ostream_iterator<string>(o,","));
}
int main()
{
vector<string> s_v;
s_v.push_back("one");
s_v.push_back("two");
cout << s_v;
}
g++ (mingw32 の gcc バージョン 4.4.0) でコンパイルでき、問題なく動作します。VC++ (Visual Studio 9) はこのコードをコンパイルできません。
error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'const std::string' (or there is no acceptable conversion)
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\ostream(653): could be 'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)'
1> with
1> [
どうしてこれなの?このコードは違法ですか? それとも、VC++ beign VC++ だけですか?
2. 未使用のテンプレート変数がコンパイルを中断します。
今、このようにostreamにテンプレートを追加すると(使用されず、そこに座っているだけです)
template <typename T> // <----- Here
ostream& operator<<(ostream& o, const vector<string>& v) {
copy(v.begin(), v.end(), std::ostream_iterator<string>(o,","));
}
int main()
{
vector<string> s_v;
s_v.push_back("one");
s_v.push_back("two");
cout << s_v;
}
gcc は演算子と一致しなくなりました。
error: no match for 'operator<<' in 'std::cout << s_v'
and a lot more candidates...
なんで?テンプレートは未使用です。それは重要ですか?
編集:これは解決されました。私は戻らなければなりませんでした。
3. 使用テンプレート
template <typename T>
ostream& operator<<(ostream& o, const vector<T>& v) {
copy(v.begin(), v.end(), std::ostream_iterator<T>(o,","));
return o; // Edited
}
int main()
{
vector<string> s_v;
s_v.push_back("one");
s_v.push_back("two");
vector<int> i_v;
i_v.push_back(1);
i_v.push_back(2);
cout << s_v;
cout << i_v;
}
私が知っている場合は、テンプレートタイプを使用してください。g++ はそれをコンパイルできますが、例外で終了します。
terminate called after throwing an instance of 'std::bad_cast'
what(): std::bad_cast
VC++ はただ座って、gcc がこれらすべてを行うのを見ているだけです。それらのいずれもコンパイルしません。
誰かが私のためにこのことを明確にしてもらえますか? ありがとうございました。