Как отформатировать связанный список с помощью оператора << = в C ++ - PullRequest
0 голосов
/ 01 мая 2019

У меня проблема с форматированием этого связанного списка в то, что говорится в комментарии TODO.Я получаю ошибку:

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;
                 ^~~

Мой вопрос в основном состоит в том, как использовать оператор <<= в этой ситуации.

Я пытался создать строку и добавить связанныйперечислите его, я попытался использовать str <<, как видно из кода, и cout <<, но эта библиотека не включена в этот класс.

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()

Вот перегруженный метод <<= method

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()

Я ожидаю, что результат будет выглядеть следующим образом:

[ B, D ]    
[ A ]    
[ D ]    
[ A, C ]

Вместо очевидной ошибки.

Спасибо.

1 Ответ

0 голосов
/ 01 мая 2019

Ваш toString() неправильно просматривает список. Вместо этого он должен выглядеть примерно так:

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<< так:

ostream& operator<<(ostream &os, const LinkedList &list) {
    os << list.toString();
    return os;
}

Что касается сообщения об ошибке, оно не соответствует коду, который вы показали. Сообщение об ошибке ссылается на указатель std::string*, но в показанном вами коде вместо него используется объект std::string. Но в любом случае, ваша реализация formatList() все еще неверна и должна выглядеть примерно так:

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()
...