【问题标题】:Why is this class's own protected member inaccessible from a template method?为什么无法从模板方法访问此类自己的受保护成员?
【发布时间】:2016-05-25 19:41:40
【问题描述】:

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

我可能在这里遗漏了一些特殊的朋友声明,但它让我无法理解。我觉得我应该能够做到这一点。

错误是:

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

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    您不能这样做,原因与ClassA 无法访问ClassB 的受保护/私有成员相同。模板类共享一个通用名称这一事实对它们来说并不重要。 ClassB&lt;T&gt;ClassB&lt;U&gt; 将彼此视为完全不同的类,因此彼此无法访问它们的成员。

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

    事实上ClassB&lt;T&gt;ClassB&lt;U&gt; 是不同的类(除非T = U,但通常情况并非如此,因此编译器不能依赖该假设)。因此,它们无法相互访问。

    【讨论】:

      【解决方案2】:

      这是语言的抽象特性。就像两个独立的类一样,ClassB&lt;T&gt;ClassB&lt;U&gt; 将彼此视为不相关并且是不同的类,因此它们无法访问彼此的 privateprotected 成员。

      【讨论】:

        猜你喜欢
        • 2015-08-14
        • 2015-12-30
        • 2015-01-30
        • 1970-01-01
        • 1970-01-01
        • 2011-01-02
        • 2016-04-07
        • 2014-01-26
        • 2014-02-22
        相关资源
        最近更新 更多