我有一个关于指针引用或指针引用或任何你想要调用它的问题,但首先是一些代码。首先,抽象比较函数模板类:
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
想点什么?
答案 0 :(得分: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);
}
基本上,const
之前的*
不会绑定到整个指针的类型,它会绑定到Node
类型。
clone
的返回类型是红鲱鱼有两个原因。首先,函数签名不包括其返回类型。因此,您肯定会创建与原始签名匹配的clone
定义,因此会覆盖它。
但是,如果您的返回类型不匹配,编译器通常会给您一个错误。除了有一个名为'contravariance'的原则允许在重写函数时允许作为引用或指针的返回类型作为引用或指向派生类的指针。
毕竟,指向派生类型的指针可以自由转换为指向基类型的指针。从某种意义上说,它们是等价的。