模板特化类不继承成员

时间:2014-11-25 04:15:18

标签: c++ templates inheritance

我有多个处理几何形状的类。

class Quad {
};

class Line {
};

然后,我有一些可以处理这些形状的类。

template< class Shape >
class Shape_Worker {
    virtual
    double
    work(
            Shape_Info< Shape >,
            Other_Class_That_Depends_On< Shape > ) = 0;
}

class Shape_Worker_Quad : public Shape_Worker< Quad > {
    double
    work(
            Shape_Info< Quad >,
            Other_Class_That_Depends_On< Quad > ) {
        // do something.
    }
};

我的班级形状信息存储一些坐标信息。一条线有一个坐标,一条四边形有两个坐标,并且从该线继承。

template< class Shape >
class Shape_Info {
};

template<>
class Shape_Info< Line > {
protected:
    double _r;
};

template<>
class Shape_Info< Quad > : public Shape_Info< Line > {
public:
    Shape_Info< Quad >::Shape_Info(
            const Shape_Info< Line > & abscissa_1,
            const Shape_Info< Line > & abscissa_2 )
        : Shape_Info< Line >( abscissa_1 )
        , _s( abscissa_2._r )
    {    
    }

protected:
    double _s;
};

当我编译此代码时,我在Shape_Info&lt;中得到以下错误: Quad&gt;复制构造函数:

double Shape_Info< Line >::_r is protected.

我做错了什么? Shape_Info&LT; Quad&gt;源自Shape_Info&lt;行&gt;,所以我不明白它为什么不继承_r变量。我忽略了什么吗?或者它与我的模板专业化有关吗?

我正在使用GCC 4.8.2。

感谢您的任何反馈,谢谢!

1 个答案:

答案 0 :(得分:0)

只是为了描述问题:您只能访问相同类对象的protected成员。如果你得到一个基类的对象(或指针或对它的引用)你可以访问它的protected成员!复制相同问题的一个更简单的例子是:

class Base {
protected:
    Base(int member): member(member) {}
    int member;
};
class Derived: public Base {
public:
    Derived(Base const& b): Base(b.member) {} // illegal: no access to `b.member`
    Derived(Derived const& d): Base(d.member) {} // OK: d is of type Derived
};

要解决您的问题,您可能需要一种合适的方式来访问_r,可能是通过提供public访问者。