从纯虚拟模板类派生

时间:2013-10-01 07:45:21

标签: c++ templates inheritance pure-virtual

当我调用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,那么我就不会再出现此错误。

有人可以帮我理解这种行为吗?

2 个答案:

答案 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 &之后)始终如一地使用它,以略微减少混淆的机会。