我正在尝试漂亮地打印一个 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 做这一切。不编译其中任何一个。
有人可以为我澄清一下吗?谢谢你。