我正在尝试构建一个打印列表的运算符,
为什么 ostream<<*它不能编译?
void operator<<(ostream& os, list<class T> &lst)
{
list<T>::iterator it;
for(it = lst.begin(); it!=lst.end(); it++)
{
os<<*it<<endl; //This row
}
}
最佳答案
因为 *it
不实现流插入。也就是说,operator<<
没有过载这需要 ostream
和一个 T
.请注意,您应该返回 ostream& os
允许运算符链接。您的函数模板定义也看起来不对。考虑改为这样做:
template< typename T >
ostream& operator<<(ostream& os, list<T> const& lst)
{
std::copy(
lst.begin(), lst.end()
, std::ostream_iterator< T >( os )
);
return os;
}
或者更好的是,支持各种元素和特征的流:
template< typename Elem, typename Traits, typename T >
std::basic_ostream< Elem, Traits >& operator<<(
std::basic_ostream< Elem, Traits >& os
, std::list<T> const& lst
)
{
std::copy(
lst.begin(), lst.end()
, std::ostream_iterator< T >( os )
);
return os;
}
此外,您可以将分隔符传递给 std::ostream_iterator
在每个元素之间插入构造函数。
* 更新:*
我刚刚注意到,即使您的函数模板声明是正确的,您也会处理依赖类型。迭代器依赖于类型 T
, 所以你需要告诉编译器:
typename list<T>::iterator it;
关于c++ - ostream<<迭代器,C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7699510/