1

ひとつ気になることがあります。オーバーロードされたメンバー関数が 1 つあるクラスがあります。

class A{
    public:
    class const_iterator{};
    class iterator : public const_iterator{};
    iterator find(const K &key);
    const_iterator find(const K &key) const;
};

広告。iterator は const_iterator から継承していますが、何も追加していません。

私がやりたいのは、通常の find 呼び出し const find 内です。このようなもの:

typename A::iterator A::find(const K &key){
     const_iterator it(find(key));
     return (*(iterator*)&it);
}

non-const find ATM の別の実装は必要ありません。このようなことは可能ですか?今は無限ループに陥っているため、find の前に「A::」を追加しても何も変わりません。

4

2 に答える 2

2
const_cast<const A*>(this)->find(key);
于 2012-11-18T13:40:19.910 に答える
2

一般に、残念ながら、これに対する明確な解決策はありません。

にキャストするだけでオーバーロードを呼び出すことができますが、結果は間違った型 (ではなく) になり、一般的なケースではこれらの間の変換が行われない可能性があります (あなたのケースでは機能しません)。findthisA const*const_iteratoriterator(*(iterator*)&it)

しかしもちろん、特別なケースでは、2 つのクラスを定義したので、適切なコンストラクターを に追加することで、そのような変換を定義iteratorできます。

class iterator : public const_iterator {
    iterator(const_iterator const& other) { 
        // Construct …
    }
};

const find次に、非実装を次のように書き直すことができます。

A::iterator A::find(const int &key){
    const_iterator it(const_cast<A const*>(this)->find(key));
    return static_cast<iterator>(it);
}

typenameちなみに、戻り値の型にがないことに注意してください。は従属名ではないため、ここでA::iterator使用する必要はありません (少なくとも C++03 では許可されていません) typename

于 2012-11-18T13:41:10.767 に答える