【问题标题】:Deriving from a pure virtual template class从纯虚拟模板类派生
【发布时间】:2013-10-07 06:54:41
【问题描述】:

调用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 * ]

我无法理解,因为我正在定义 TestComp::Equals,其签名似乎与 IComparable::Equals 相同。

我在尝试各种解决方法时注意到的一件事是,如果我将两个函数都设为“Equals(R & rhs) const”,从参数中删除 const,那么我将不再收到此错误。

谁能帮我理解这种行为?

【问题讨论】:

    标签: c++ templates inheritance pure-virtual


    【解决方案1】:

    派生方法的签名不正确。应该是

    virtual bool Equals(char* const& a) const
    

    请注意,const 被“应用”到下一个最接近的 *&amp;&amp;&amp; 之前的类型,即,

    • const char* &amp;,等价于char const* &amp;,表示对指向char的常量指针的引用。

    • char* const&amp; 表示对指向char 的指针的常量引用。

    • const R&amp;,相当于R const&amp;,表示对R的常量引用。

    【讨论】:

      【解决方案2】:
      const R &
      

      这是一个 const 引用(或者,学究式地,对 const 对象的引用)。

      const char* & a
      

      这是一个非const 引用(指向一个const 对象的指针);因此,它不会覆盖采用const 引用的函数。您需要对非const 指针的const 引用:

      char * const & a
      

      const 总是限定事物在它之前,除非它出现在开头,在这种情况下它限定第一个事物。有些人建议养成将其始终放在符合条件的事物之后的习惯,即R const &amp;而不是const R &amp;,以稍微减少混淆的机会。

      【讨论】:

        猜你喜欢
        • 2015-03-31
        • 1970-01-01
        • 2018-01-05
        • 2015-07-12
        • 1970-01-01
        • 2017-04-13
        • 1970-01-01
        • 2021-03-19
        相关资源
        最近更新 更多