0

私はそれが無数に出てきたことを知っていますが、今回は自動生成されたコードでした:

class testGetter{
    testGetter * ptr; // wrote this
public:
// this is autogenerated by eclipse
    const testGetter*& getPtr() const {
        return ptr;
    }

    void setPtr(const testGetter*& ptr) {
        this->ptr = ptr;
    }
};

私はWindows 7 mingw-g ++バージョン4.7.0を使用しています

Eclipse (juno) のテンプレートのバグですか?

編集: コンパイラの呼び出し:

g++ -O0 -g3 -Wall -c -fmessage-length=0 -fpermissive -o Visitor.o "..\\Visitor.cpp"

EDIT 2013.06.12 :ここで得たフィードバックの後に報告したことを追加する必要がありました

4

1 に答える 1

2
 const testGetter*&

これは、 const への非 const ポインターへの参照を表しますtestGettertestGetter*aからその型に変換することはできません。次の例では const-correctness が壊れてしまうためです。

const testGetter tmp;
testGetter t;
t.getPtr() = &tmp;     // !!!

変換が許可されている場合、上記のコードはコンパイルされ、!!! でマークされた行の後 内部に格納されているポインターt(タイプはtestGetter*) は を指しconst testGetter、コードの const-correctness を壊します。

おそらく、ポインターへの参照ではなく、ポインターだけを返したいと思うでしょう:

const testGetter* getPtr() const

constまたは、 const-correctness を保証するためにエクストラを追加します。

const testGetter *const& getPtr() const

いずれの場合も、コードは、内部testGetter*const testGetter.

ゲッターがツール (Eclipse) によって自動生成された場合、ツールにバグがあるか、単純すぎて正しいコードを生成できません。ゲッターを手動で作成するか、ジェネレーターの出力を修正する必要があります。


補足: Eclipse CDT または g++ の選択を考えると、バグが Eclipse にあることの方が多いに違いありません。

于 2012-10-31T12:27:56.213 に答える