ошибка C2872: 'range_error': неоднозначный символ - PullRequest
1 голос
/ 29 октября 2010

Я уже искал SO и Google, я не объявляю одну и ту же переменную в двух местах, и при этом я не добавляю что-то странным образом ... что я знаю Метод вставки должен работать нормально, это заранее написанный метод (я думаю, это тоже может быть неправильно .. смеется). Это ошибка, которую я получаю.

Ошибка:

error C2872: 'range_error' : ambiguous symbol
........ while compiling class template member function 'Error_code List<List_entry>::insert(int,const List_entry &)'

Для меня метод вставки выглядит хорошо, я не вижу проблем с переменной позиции, которая сравнивается с 0 или счетчиком, который объявлен как 0 в конструкторе для возврата range_error.

Метод вставки:

template <class List_entry>
Error_code List<List_entry>::insert(int position, const List_entry &x){
    Node<List_entry> *new_node, *following, *preceding;
    if(position < 0 || position > count){
        return range_error;
    }
    if(position == 0){
        if(count == 0) following = nullptr;
        else {
            set_position(0);
            following = current;
        }
        preceding = nullptr;
    }
    else {
        set_position(position - 1);
        preceding = current;
        following = preceding->next;
    }

    new_node = new Node<List_entry>(x, preceding, following);

    if(new_node == nullptr) return overflow;
    if(preceding != nullptr) preceding->next = new_node;
    if(following != nullptr) following->back = new_node;

    current = new_node;
    current_position = position;
    count++;

    return success;
}

Может быть проблема в том, что у меня нет реализации перегруженного оператора =?

Весь код здесь: pastie.org / 1258159

Ответы [ 4 ]

7 голосов
/ 29 октября 2010

range_error определяется как в вашем коде (в глобальном пространстве имен), так и в стандартной библиотеке (в пространстве имен std). Использование using namespace std; для перетаскивания всего стандартного пространства имен в глобальное пространство имен создает неоднозначность. Вы должны сделать хотя бы одно из следующего:

  • удалить using namespace std из глобального пространства имен; либо используйте пространство имен в своих функциях, либо используйте только те имена, которые вам нужны, или укажите все стандартные имена, когда вы их используете
  • тщательно выбирайте свои собственные имена, чтобы избежать конфликтов со стандартными именами
  • поместите свои собственные имена в пространство имен (и не тяните это в глобальное пространство имен).
2 голосов
/ 29 октября 2010

Альтернативное решение (в дополнение к уже указанным) состоит в определении имени ::range_error.Вот для чего нужны пространства имен.Вот почему стандартная библиотека lib находится в пространстве имен std, поэтому такие конфликты могут быть очень легко разрешенными.

В представленном выше коде

if(new_node == nullptr) return overflow;

никогда не выполнит return.

Вы понимаете, почему?

Приветствия & hth.,

PS: Повторяйте код программы вставки, обратите внимание, что main должениметь тип результата int, а не void.Кроме того, многие функции не могут вернуть значение.

2 голосов
/ 29 октября 2010

Ваш оператор using namespace std; вверху вводит объявление std::range_error исключение из заголовка stdexcept.Это противоречит вашему enum значению.Включите enum в struct и полностью определите:

struct my_errors {
    enum {
        // ...
        range_error
    };
};
// ...
return my_errors::range_error;

Или просто избегайте использования имен из стандартной библиотеки.

2 голосов
/ 29 октября 2010

range_error - это класс, определенный в заголовке stdexcept.В вашем коде вы, вероятно, используете константу с тем же именем и делаете std::range_error видимым с директивой using namespace std;, что приводит к неоднозначности.Либо переименуйте вашу константу, либо измените ваши директивы использования.

Например:

#include <stdexcept>

using namespace std;

int range_error = 42;

int main()
{
    return range_error;
}

Приведенный выше код вызывает ту же ошибку.

...