C++ 为什么这个班是';s自己的受保护成员无法从模板方法访问?
为什么我不能从类的模板方法访问受保护的成员 我可能错过了一些特别的朋友宣言,但我没有。我觉得我应该能够做到这一点 错误是:C++ 为什么这个班是';s自己的受保护成员无法从模板方法访问?,c++,templates,C++,Templates,为什么我不能从类的模板方法访问受保护的成员 我可能错过了一些特别的朋友宣言,但我没有。我觉得我应该能够做到这一点 错误是: 错误:“char*ClassB::a”受保护 示例来源: template<typename T> class ClassA; template<typename T> class ClassB { protected: T* a; public: ClassB() : a(0) {} template<typen
错误:“char*ClassB::a”受保护
示例来源:
template<typename T>
class ClassA;
template<typename T>
class ClassB {
protected:
T* a;
public:
ClassB()
: a(0) {}
template<typename U>
ClassB(const ClassB<U>& other)
:
// error: ‘char* ClassB<char>::a’ is protected
a(other.a) {}
};
////
template<typename T>
class ClassA : public ClassB<T> {
public:
ClassA() {}
};
////
namespace name {
typedef ClassA<char> A;
typedef ClassB<const char> B;
}
int main() {
name::A a;
name::B b = a;
return 0;
}
模板
甲级;
模板
B类{
受保护的:
T*a;
公众:
类别b()
:a(0){}
模板
B类(施工B类和其他)
:
//错误:“char*ClassB::a”受保护
a(其他.a){}
};
////
模板
A类:公共B类{
公众:
ClassA(){}
};
////
名称空间名称{
类别A;
类型定义B类;
}
int main(){
名称:A;
名称::B=a;
返回0;
}
您不能这样做的原因与ClassA
无法访问ClassB
的受保护/私有成员的原因相同。模板类共享一个公共名称这一事实对它们来说并不重要ClassB
和ClassB
将彼此视为完全不同的类,因此彼此无法访问其成员
当您意识到可以专门化模板类时,这一点的原因就更清楚了,这意味着可以有ClassB
的实现,这些实现没有名为a
的成员(或者有名为a
的成员,但使用方式完全不同,因此不应该访问)
事实是ClassB
和ClassB
是不同的类(除非T=U
,但这通常不是真的,因此编译器不能依赖于该假设)。因此,它们不能相互访问。您不能这样做的原因与ClassA
无法访问ClassB
的受保护/私有成员的原因相同。模板类共享一个公共名称这一事实对它们来说并不重要ClassB
和ClassB
将彼此视为完全不同的类,因此彼此无法访问其成员
当您意识到可以专门化模板类时,这一点的原因就更清楚了,这意味着可以有ClassB
的实现,这些实现没有名为a
的成员(或者有名为a
的成员,但使用方式完全不同,因此不应该访问)
事实是ClassB
和ClassB
是不同的类(除非T=U
,但这通常不是真的,因此编译器不能依赖于该假设)。因此,它们不能相互访问。这是该语言的一个抽象特性。就像两个独立的类一样,ClassB
和ClassB
将彼此视为不相关且是不同的类,因此它们无法访问彼此的私有和受保护的成员。这是该语言的一个抽象特性。就像两个独立的类一样,ClassB
和ClassB
将彼此视为不相关且不同的类,因此它们无法访问彼此的私有
和受保护
成员