模板专用化中出现受保护成员访问错误
Protected member access error in template specialization
class safe_bool_base {
protected:
void this_type_does_not_support_comparisons() const {}
};
template <typename T=void> class safe_bool : public safe_bool_base {
public:
void func() {
&safe_bool::this_type_does_not_support_comparisons;
&safe_bool_base::this_type_does_not_support_comparisons;
}
};
template<> class safe_bool<void> : public safe_bool_base {
public:
void func() {
&safe_bool::this_type_does_not_support_comparisons;
&safe_bool_base::this_type_does_not_support_comparisons;
}
};
错误消息:
zzz.cpp: In member function 'void safe_bool<void>::func()':
zzz.cpp:7:10: error: 'void safe_bool_base::this_type_does_not_support_comparison
s() const' is protected
void this_type_does_not_support_comparisons() const {}
^
zzz.cpp:22:24: error: within this context
&safe_bool_base::this_type_does_not_support_comparisons;
^
我想知道为什么受保护的成员不能在模板专业化中访问。这些代码毫无意义,只是为了测试。
当public从基类继承时,其受保护的成员将成为派生类的"保护成员",可以在派生类的成员函数中访问该成员。请注意,它们只能通过派生类本身(及其派生类(进行访问。但是受保护的成员不能通过基类访问。这就是为什么&safe_bool::this_type_does_not_support_comparisons;
有效而&safe_bool_base::this_type_does_not_support_comparisons;
无效的原因。
从标准来看,11.4/1受保护的成员访问[受保护类别]:
(强调我的(
除第条前面所述之外的额外访问检查当非静态数据成员或非静态时应用[class.access]成员函数是其命名类的受保护成员([class.access.base](114如前所述,访问受保护的由于引用发生在朋友或成员中,因此授予成员如果访问是为了形成指向成员的指针([expr.unary.op](,嵌套名称说明符应表示C或类派生自C。所有其他访问都涉及(可能是隐式的(对象表达式([expr.ref](。在这种情况下,对象的类表达式应为C或从C派生的类。[示例:
class B { protected: int i; static int j; }; class D1 : public B { }; class D2 : public B { friend void fr(B*,D1*,D2*); void mem(B*,D1*); }; ... void D2::mem(B* pb, D1* p1) { pb->i = 1; // ill-formed p1->i = 2; // ill-formed i = 3; // OK (access through this) B::i = 4; // OK (access through this, qualification ignored) int B::* pmi_B = &B::i; // ill-formed int B::* pmi_B2 = &D2::i; // OK j = 5; // OK (because j refers to static member) B::j = 6; // OK (because B::j refers to static member) } ...
--结束示例]
请注意标准中示例代码中的语句int B::* pmi_B = &B::i; // ill-formed
,基本上与代码的情况相同。顺便说一句,这与模板专业化无关。
相关文章:
- C++:无法访问声明的受保护成员
- 相同的层次结构,访问基类的受保护成员时的行为不同
- 同一模板类但模板类型的受保护成员
- 派生类无法访问基类的受保护成员
- 继承期间受保护成员的皮条
- 如何将超类的受保护成员访问到其派生类. 如果已在派生类中声明了具有相同名称的函数?
- 是否可以基于私有/受保护成员分配类枚举?
- 依赖模板基础的受保护成员
- 无法从派生类型的作用域访问另一个实例的受保护成员
- 为什么我无法使用受保护/私有继承访问派生实例中基类的受保护成员?
- 将对象强制转换为派生类以访问父类的受保护成员
- 使从一个基类派生的类能够使用继承的受保护成员
- 派生类如何使用基类的受保护成员
- 访问派生类C++中的受保护成员
- 访问基类的受保护成员
- 如何访问多个继承类中的受保护成员
- 如何从另一个类的基类访问派生类中的受保护成员
- 无法访问派生类中的基本受保护成员!(在虚函数中)
- 如何通过派生类访问基类的受保护成员?
- 如果孩子不需要父母班级的所有受保护成员,这是不好的班级设计吗?