1

我已经搜索过 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

4 回答 4

7

range_error在您的代码(在全局命名空间中)和标准库(在std命名空间中)定义。您使用using namespace std;将整个标准名称空间拖到全局名称空间中会产生歧义。您应该至少执行以下操作之一:

  • using namespace std从全局命名空间中移除;要么在你的函数中使用命名空间,要么只使用你需要的名称,或者在使用它们时限定所有标准名称
  • 谨慎选择自己的名称,避免与标准名称冲突
  • 将您自己的名称放在命名空间中(不要将其拉入全局命名空间)。
于 2010-10-29T15:50:05.680 回答
2

range_error是在stdexcept头文件中定义的类。在您的代码中,您可能会使用同名的常量,并使用导致歧义std::range_error的指令使其可见。using namespace std;重命名常量或修改 using 指令。

例如:

#include <stdexcept>

using namespace std;

int range_error = 42;

int main()
{
    return range_error;
}

上面的代码会导致同样的错误。

于 2010-10-29T15:45:02.640 回答
2

using namespace std;在顶部的声明从标题中引入了std::range_error异常声明。stdexcept这与您的enum价值相冲突。enum将a括起来struct并完全限定:

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

或者只是避免使用标准库中的名称。

于 2010-10-29T15:46:21.363 回答
2

另一种解决方案(除了已经给出的解决方案)是限定名称,::range_error. 这就是命名空间的用途。这就是为什么标准 lib 的东西在 namespace 下的原因std,因此可以容易地解决此类冲突。

在上面显示的代码中,

if(new_node == nullptr) return overflow;

永远不会执行return.

你能看出为什么吗?

干杯&hth.,

PS:重新粘贴本代码,注意main必须有结果类型int,而不是void. 此外,许多函数无法返回值。

于 2010-10-29T16:15:39.483 回答