我有多个处理几何形状的类。
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。
感谢您的任何反馈,谢谢!
答案 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
访问者。