【发布时间】:2011-07-18 07:48:41
【问题描述】:
在思考C++ iterator question时,我写了这个示例程序:
#include <vector>
#include <iostream>
#include <iterator>
#include <algorithm>
template <class T>
std::ostream& operator<<(std::ostream&os, const std::vector<T>& v)
{
os<<"(";
std::copy(v.begin(), v.end(), std::ostream_iterator<T>(os, ", "));
return os<<")";
}
int main()
{
std::vector<int> v(3);
std::vector<std::vector<int> > vv(3, v);
std::cout << v << "\n"; // this line works
std::cout << vv << "\n"; // this line produces error
}
我用 gcc 编译这个程序并得到典型的 100 行错误。我相信相关的部分是:
it.cc:19:从这里实例化
/usr/include/c++/4.4/bits/stream_iterator.h:191: 错误:'((std::ostream_iterator >, char, std::char_traits > )this)->std::ostream_iterator >, char, std::char_traits >::_M_stream
为什么会失败?在我的模板operator<< 中,我尝试指定任何矢量,无论其类型如何,都是可打印的。那么为什么std::vector<std::vector<>> 不打印呢?
编辑:在模板函数中使用以下代码使其工作
#if 0
std::copy(v.begin(), v.end(), std::ostream_iterator<T>(os, ", "));
#else
for(typename std::vector<T>::const_iterator it = v.begin();
it != v.end();
it++) {
os<<(*it)<<", ";
}
#endif
【问题讨论】:
-
在英特尔 C++ 中也不起作用。
-
用手动循环替换
std::copy是否有效? -
我不知道发生这种情况的确切原因(我认为这与 ADL 有关)。但我发现,如果我将函数放入 std 命名空间,它就可以解决问题。虽然我不确定这是否是个好主意。
-
谢谢@larsmans。它在
clang++中也失败了。我认为问题出在我的程序中,而不是编译器。 -
谢谢,@Benjamin。在
std::中放任何东西似乎是个坏主意。