为什么这个类自己的受保护成员无法从模板方法中访问?

时间:2016-02-15 01:24:29

标签: c++ templates

为什么我不能从类的模板方法访问受保护的成员?

我可能在这里遗漏了一些特殊的朋友声明,但它让我望而却步。我觉得我应该能够做到这一点。

错误是:

error: ‘char* ClassB<char>::a’ is protected

示例来源:

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;
}

2 个答案:

答案 0 :(得分:2)

由于ClassA无法访问ClassB的受保护/私有成员的相同原因,您无法执行此操作。模板化类共享一个共同名称的事实对他们来说并不重要。 ClassB<T>ClassB<U>互相对待完全不同的类,因此彼此无法访问其成员。

当您意识到可以专门化模板化类时,这一点变得更加清晰,这意味着可以使ClassB的实现没有名为a的成员(或者有成员)命名为a,但以完全不同的方式使用它,因此不应该访问它。

事实是ClassB<T>ClassB<U>是不同的类(除非T = U,但这通常不正确,因此编译器不能依赖于该假设)。因此,他们无法互相访​​问。

答案 1 :(得分:0)

这是该语言的抽象功能。就像两个独立的课程一样,ClassB<T>ClassB<U>相互对待,因为他们不相关且是不同的课程,因此他们无法访问private和{{1彼此的成员。