Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这个班是';s自己的受保护成员无法从模板方法访问?_C++_Templates - Fatal编程技术网

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
将彼此视为不相关且不同的类,因此它们无法访问彼此的
私有
受保护
成员