3

ポインターへの参照、またはポインター参照、またはそれを何と呼びたいかについて質問がありますが、最初にいくつかのコードです。まず、抽象比較関数テンプレート クラス:

template <class T> struct BinaryTrivalent {
    virtual BinaryTrivalent<T>* clone() const = 0;
    virtual int operator()(const T& lhs, const T& rhs) const = 0;
    int compare(const int a, const int b) const {
        if (a < b)
            return LESS_THAN;
        else if(a == b)
            return MATCH;
        return MORE_THAN;
    }
};

そしてそれの実際の使用:

struct NodePCompare : public BinaryTrivalent<Node*> {
    NodePCompare* clone() const { return new NodePCompare(*this); }
    int operator()(const Node*& lhs, const Node*& rhs) const {
        return compare(lhs, rhs);
    }
};

operatorテンプレートは実際の型では問題なく動作しますが、期待どおりに認識されないようで、NodePCompare抽象的であることがわかります。
私は過去にこの問題に遭遇しましたが、問題が何であるかを把握することをあきらめ、ポインターを別の型でラップしました。
今でも同じことができますが、本当の問題が何であるかを理解したいと思います。
この文脈で正確に何を意味するのかを読んでい*&ますが、正しく理解していない限り、これはうまくいくはずです。
このリンクは、それを理解するのに少し役立ちました: http://markgodwin.blogspot.co.il/2009/08/c-reference-to-pointer.html

アイデアはありますか?

4

1 に答える 1

4

あなたの問題は、署名が実際には一致しないことです。

これは次のようになります。

int operator()(Node* const & lhs, Node* const & rhs) const {
    return compare(lhs, rhs);
}

問題は、どこにconst適用するかです。typedef Node * base_T_arg_t;クラスのプライベート セクションで次のように言ってから、同じことを行うことができます。

int operator()(const base_T_arg_t &lhs, const base_T_arg_t &rhs) const {
    return compare(lhs, rhs);
}

基本的には、constbefore は*全体としてポインタの型にバインドするのではなく、 type にバインドしNodeます。

の戻り値の型cloneは、2 つの理由からおかしなものです。まず、関数シグネチャには戻り値の型が含まれていません。cloneしたがって、元の署名と一致する の定義を作成しているため、それをオーバーライドすることは間違いありません。

ただし、戻り値の型が一致しない場合、コンパイラは通常エラーを返します。関数がオーバーライドされたときに、参照またはポインターである戻り値の型を派生クラスへの参照またはポインターにすることを許可する「反変性」と呼ばれる原則があることを除いて。

結局、派生型へのポインターは、基本型へのポインターに自由に変換できます。それらは、ある意味で同等です。

于 2013-01-06T16:15:25.437 に答える