为什么我不能从类的模板方法访问受保护的成员?
我可能在这里遗漏了一些特殊的朋友声明,但它让我望而却步。我觉得我应该能够做到这一点。
错误是:
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;
}
答案 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彼此的成员。