1

我正在尝试构建一个打印列表的运算符,
为什么 ostream<<*it 不能编译?

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
     }
}

您正在使用浮动组件图像。确保 ptr 的类型为 float* 并尝试将值设置为 0.5f 而不是 4294967297。

4

4 回答 4

3

因为*it没有实现流插入。也就是说,没有重载operator<<需要 aostream和 a 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构造函数,以便在每个元素之间插入。

* 更新:* 我刚刚注意到,即使你的函数模板声明是正确的,你也会处理依赖类型。迭代器依赖于 type T,所以你需要告诉编译器:

typename list<T>::iterator it;
于 2011-10-08T20:18:57.400 回答
1

我认为问题出在您的模板声明中。以下应该可以编译并正常工作:

template <typename T>
void operator<<(ostream& os, list<typename T> &lst)
{
      list<T>::iterator it;
      for(it = lst.begin(); it!=lst.end(); it++)
      {
                  os<<*it<<endl;
      }
}

这当然是因为您的列表的元素类型实际上可以与 . 的<<运算符一起使用ostream

于 2011-10-08T20:25:28.453 回答
1

您以错误的方式使用模板语法:

template<class T>
void operator<<(ostream& os, list<T> &lst)
{
    list<T>::iterator it;
    for(it = lst.begin(); it!=lst.end(); it++)
    {
        os<<*it<<endl; //This row
    }
}

顺便说一句,您应该返回对流的引用以允许输出运算符的链接,并且列表应该是 const,您还可以使用标准库进行输出循环:

template<class T>
std::ostream& operator<<(std::ostream& os, const std::list<T> &lst)
{
    std::copy(lst.begin(), lst.end(), std::ostream_iterator<T>(os, "\n"));
    return os;
}
于 2011-10-08T20:26:14.253 回答
-1

改写为:

template<class T>
ostream& operator<<(ostream& os, list<T>& lst){
    typename list<T>::iterator it;
    for(it = lst.begin(); it != lst.end(); ++it){
                 os << *it << endl;
    }
    return os;
}
于 2011-10-11T09:13:50.873 回答