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