当我调用TestComp的构造函数时遇到编译错误,其设计如下:
template <typename R>
class IComparable
{
public:
virtual bool Equals(const R & rhs) const = 0;
};
class TestComp : IComparable<char*>
{
public:
std::string x;
TestComp(std::string & a)
{
x = a;
}
virtual bool Equals(const char* & a) const
{
return x == std::string(a);
}
};
错误:
error C2259: 'TestComp2' : cannot instantiate abstract class due to following members:'bool IComparable<R>::Equals(const R &) const' : is abstract with [ R=char * ]
我无法理解,因为我正在使用与IComparable :: Equals相同的签名来定义TestComp :: Equals。
在尝试各种变通方法时我注意到的一件事是,如果我使两个函数'Equals(R&amp; rhs)const'从参数中删除const,那么我就不会再出现此错误。
有人可以帮我理解这种行为吗?
答案 0 :(得分:4)
派生方法的签名不正确。它应该是
virtual bool Equals(char* const& a) const
请注意,const
被“应用”到下一个最近的*
和&
以及&&
之前的类型,即
const char* &
,相当于char const* &
,表示对指向char
的const指针的引用。
char* const&
表示对指向char
的指针的const引用。
const R&
,相当于R const&
,表示对R
的const引用。
答案 1 :(得分:2)
const R &
这是const
引用(或者,讽刺地,对const
对象的引用)。
const char* & a
这是一个非const
引用(指向const
对象的指针);因此,它不会覆盖const
引用的函数。您需要const
对非const
指针的引用:
char * const & a
const
总是限定之前的事物,除非它在开始时出现,在这种情况下它首先符合条件。有些人建议养成一种习惯,即在符合条件的事物(即R const &
而不是const R &
之后)始终如一地使用它,以略微减少混淆的机会。