首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C++中使用<<=运算符格式化链表

如何在C++中使用<<=运算符格式化链表
EN

Stack Overflow用户
提问于 2019-05-01 09:26:38
回答 1查看 106关注 0票数 0

我在将此链表格式化为TODO注释中的内容时遇到问题。我得到的错误是:

代码语言:javascript
复制
In file included from main.cpp:3:0:

Graph.h: In member function ‘std::__cxx11::string Graph::formatList()’:
Graph.h:63:14: error: invalid operands of types ‘std::__cxx11::string* {aka std::__cxx11::basic_string<char>*}’ and ‘LinkedListPtr {aka LinkedList<char>*}’ to binary ‘operator<<’
          str << adjList << endl;
          ~~~~^~~~~~~~~~
Graph.h:65:17: error: could not convert ‘str’ from ‘std::__cxx11::string* {aka std::__cxx11::basic_string<char>*}’ to ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’
          return str;
                 ^~~

我的问题主要是在这种情况下如何使用<<=运算符。

我已经尝试创建一个字符串并将链表附加到它,我已经尝试使用在代码和cout <<中看到的str <<,但是那个库没有包含在那个类中。

代码语言:javascript
复制
string formatList(){

    /* TODO (2):
     *
     * Return a string representation of the list. 
     * 
     * Each list should be written on a separate line, using the LinkedList's
     * <<() function.
     * 
     * Sample:
     * [ B, D ]
     * [ A ]
     * [ D ]
     * [ A, C ]
     */
     string str;

     str << adjList << endl;

     return str;        

}// end displayList()

下面是方法重载的<<=方法

代码语言:javascript
复制
virtual string toString() const{

    ostringstream oss;

    oss << "[ ";
    if ( !isEmpty() ) {
        nodeptr_t iter = head->next;
        while ( iter->next != tail ) {
            oss << iter->element << ", ";
            iter = iter->next;
        }
        oss << iter->element << " ";
    }
    oss << "]";

    return oss.str();
}// end toString()

我的期望是输出如下所示:

代码语言:javascript
复制
[ B, D ]    
[ A ]    
[ D ]    
[ A, C ]

而不是一个明显的错误。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2019-05-01 11:38:20

您的toString()不正确地遍历列表。它需要看起来更像这样:

代码语言:javascript
复制
virtual string toString() const {
    ostringstream oss;
    oss << "[ ";
    if ( !isEmpty() ) {
        nodeptr_t iter = head;
        while ( iter != tail ) {
            oss << iter->element << ", ";
            iter = iter->next;
        }
        oss << iter->element << " ";
    }
    oss << "]";
    return oss.str();
}// end toString()

然后你可以像这样实现你的operator<<

代码语言:javascript
复制
ostream& operator<<(ostream &os, const LinkedList &list) {
    os << list.toString();
    return os;
}

至于错误消息,它与您显示的代码不匹配。错误消息引用的是std::string*指针,但在您显示的代码中,它使用的是std::string对象。但无论哪种方式,您的formatList()实现仍然是错误的,应该看起来更像这样:

代码语言:javascript
复制
string formatList() {

    /* TODO (2):
     *
     * Return a string representation of the list.
     *
     * Each list should be written on a separate line, using the LinkedList's
     * <<() function.
     *
     * Sample:
     * [ B, D ]
     * [ A ]
     * [ D ]
     * [ A, C ]
     */
    ostringstream oss;
    oss << *adjList << endl;
    return oss.str();
}// end displayList()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55930595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档