Ошибка компилятора C ++: P1LinkedList. cpp: 145: ошибка: вызов перегруженного 'to_string (int &)' является неоднозначным - PullRequest
0 голосов
/ 27 января 2020

Я реализую связанный список. Я получаю сообщение об ошибке:

P1LinkedList.cpp:145: error: call of overloaded ‘to_string(int&)’ is ambiguous
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/basic_string.h:2604: note: candidates are: std::string std::to_string(long long int)
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/basic_string.h:2610: note:                 std::string std::to_string(long long unsigned int)
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/basic_string.h:2616: note:                 std::string std::to_string(long double)

(я компилирую свой код с помощью g++ -std=c++0x

Метод, генерирующий это исключение:

std::string P1LinkedList::print(){

    std::string print = "";
    iterator itr = begin();

    for(int i = 0; i < theSize; i++){
        print += std::to_string(itr.current->data) + " ";
        itr++;
    }

    return print; 
}

current это текущий узел, на который указывает итератор. data - это int, который находится в классе Node.

Node.h:

#ifndef Node_h
#define Node_h

struct Node{

        int data; 
        Node* next; 
        Node* prev; 

        Node(const int & d = 0, Node *p = 0, Node *n = 0); 
};

#endif

Часть моего const_iterator .h файл, в котором объявлен current (мой класс iterator расширяется от класса '' 'const_iterator' '':

    protected:  
        Node *current; 
        int& retrieve() const; 
        const_iterator(Node*p); 
        friend class P1LinkedList; 
};

Я пытаюсь передать data через to_string как обычное значение int, которое, как я думал, itr.current->data делал, но мог ли я получить эту ошибку, потому что она не передает значение типа int, а вместо этого указывает на него?

1 Ответ

0 голосов
/ 28 января 2020

То, что @NathanOliver говорит правильно, должен быть экземпляр шаблона для 'int'. Сообщение об ошибке в основном гласит, что компилятор не уверен, какую «версию» (= перегрузку) функции использовать, он имеет (потенциально разные) реализации для типа ввода long long int, unsigned long long int long long double, но вы просим его работать с int. Опять же, должна быть перегрузка для int, так что это немного странно.

Что вы можете сделать, чтобы запустить вашу программу в текущей среде, это использовать одну из предложенных перегрузок, приведя к int64_t и, следовательно, для использования одной из доступных функций.

print += std::to_string(static_cast<long long int>(itr.current->data)) + " ";

Ссылка:

здесь , вы можете найти список функций, которые должны существовать. Обязательно правильно #include <string> и не вызывать неопределенное поведение, определяя макросы препроцессора, начиная с _, работающего в пространстве имен std, но я думаю, что это не проблема здесь.

...