1

私はすでにSOとグーグルを検索しました.2つの場所で同じ変数を宣言していませんし、奇妙な方法で何かを含めていません..私が知っている. 挿入メソッドは正常に機能するはずです。これは事前に作成されたメソッドです (それも間違っている可能性があると思います.. 笑)。これは私が得るエラーです。

エラー:

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;て標準名前空間全体をグローバル名前空間にドラッグすると、あいまいさが生じます。次の少なくとも 1 つを実行する必要があります。

  • using namespace stdグローバル名前空間から削除します。関数内で名前空間を使用するか、必要な名前だけを使用するか、使用するときにすべての標準名を修飾します
  • 標準名との競合を避けるために、独自の名前を慎重に選択してください
  • 独自の名前を名前空間に配置します (それをグローバル名前空間に取り込まないでください)。
于 2010-10-29T15:50:05.680 に答える
2

上部のステートメントは、ヘッダーからの例外using namespace std;の宣言をもたらします。これはあなたの価値観と矛盾します。を aで囲み、完全修飾します。std::range_errorstdexceptenumenumstruct

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

または、標準ライブラリの名前を使用しないでください。

于 2010-10-29T15:46:21.363 に答える
2

別の解決策 (既に示したものに加えて) は、名前を修飾すること::range_errorです。それが名前空間の目的です。そのため、標準の lib が namespacestdでダウンしているため、そのような競合は非常に簡単に解決できます。

上記のコードでは、

if(new_node == nullptr) return overflow;

を実行することはありませんreturn

理由がわかりますか?

乾杯 & hth.,

PS: ペーストブック コードでは、 ではなくmain結果タイプが必要であることに注意してください。また、多くの関数は値を返すことができません。intvoid

于 2010-10-29T16:15:39.483 に答える
2

range_errorstdexceptヘッダーで定義されたクラスです。あなたのコードでは、おそらく同じ名前の定数を使用し、あいまいさをもたらすディレクティブで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 に答える