2

開発マシンをリリースされたばかりの12.04バージョンのUbuntuに更新しました。これにより、新しいバージョンのGCC(4.6.3)が提供されたようです。これで、正常にコンパイルするために使用されたソースコードで、コンパイラによって生成された代入演算子に関するエラーが発生します。

source / local.cpp:1185:59:エラー:'olddata = stype :: block_t((*(const oc :: json_t *)(&local :: database_t :: getData(const sdata :: uuid_t&、size_t *、sdata :: override :: type_t)((*&uuid)、(&otype)、(sdata :: override :: type_t)1u)))、0) '
source / local.cpp:1185:59:注:候補者は:
source / sdata / block.hpp:13:7:注:sdata :: block_t&sdata :: block_t :: operator =(sdata :: block_t&)
source / sdata / block.hpp:13:7:注:引数1の「sdata::block_t」から「sdata::block_t&」への既知の変換はありません

私が知る限り、コンパイラによって生成されたものには、ではなくoperator=署名が必要です。これはこのバージョンのGCCのバグですか、それとも私の理解が間違っていますか?GCCバグトラッカーでこれへの参照を見つけることができず、他の誰もそれに遭遇していないとは信じられません。foo& operator=(const foo&)foo& operator=(foo&)

(Googleは等号を含む用語の検索を容易にしませんが、忍耐強く、ここでこの問題への単一の参照を見つけ、GCC 4.6.2について説明しました。)

4

2 に答える 2

0

私が一度行った文字列クラスの例:

String& String::operator=(const String& other)  {       
    // checking for self-assignment (pointer-compare)       
    if(this != &other) {
        delete[] s_buffer;
        s_length = other.Length();
        s_buffer = new char[s_length+1];
        memcpy(s_buffer,other.c_str(),s_length+1);
    }
    return *this;   
}
于 2012-04-28T08:48:44.520 に答える
0

何が正しいのかわかりませんが、GCC の動作は間違いなく問題を引き起こします。私はそれをバグと呼んでいます。

奇妙なことに、すべてのクラスで発生するわけではなく、ごく一部のクラスでのみ発生するようです。そのため、簡単な例を思いつくまで、実際にバグレポートを提出することはできません.

于 2012-05-02T01:37:15.613 に答える