c++ - 引用指针问题

标签 c++ pointers reference

我有一个关于指针引用、指针引用或任何您想调用它的问题,但首先是一些代码。首先是一个抽象的比较函数模板类:

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

有人有想法吗?

最佳答案

您的问题是签名并不真正匹配。

应该是这样的:

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

问题是 const 最终应用的地方。您可以通过在类的私有(private)部分中说 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);
}

基本上,* 之前的const 并没有绑定(bind)到整个指针的类型,它绑定(bind)到类型Node.

clone 的返回类型是一个红色鲱鱼,原因有两个。首先,函数签名不包括其返回类型。因此,您肯定是在创建与原始签名匹配的 clone 定义,因此将覆盖它。

但是,如果您的返回类型不匹配,编译器通常会给您一个错误。除了有一个叫做' contravariance 的原则' 当函数被重写时,允许作为引用或指针的返回类型成为指向派生类的引用或指针。

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

关于c++ - 引用指针问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14183902/

相关文章:

c++ - 如何声明和实现一个 const 和 inline 成员函数?

c++ - 尽管链接了目标库,但仍出现 undefined reference 错误

c - 修改链表中的头指针

Javascript创建对对象属性的引用?

c++ - `const std::string& s = nullptr` 作为可选参数如何工作

c++ - std::move 如何复制不可复制的对象?

c++ - VTK - 从 6.1 迁移到 8.2 [2]

c - 二进制转十进制...输出错误

c++ - C++ 中的 int[pointer-to-array] 是标准的吗?

c++ - 将对象引用转换为 STL 迭代器