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是红鲱鱼,原因有两个。首先,函数签名不包括其返回类型。因此,您绝对是在创建clone与原始签名匹配的定义,因此将覆盖它。

但是,如果您的返回类型不匹配,编译器通常会给您一个错误。除了有一个称为“逆变”的原则,它允许作为引用或指针的返回类型在函数被覆盖时成为派生类的引用或指针。

毕竟,指向派生类型的指针可以自由转换为指向基类型的指针。从某种意义上说,它们是等价的。

于 2013-01-06T16:15:25.437 回答