公共继承的模板朋友类

时间:2011-11-17 11:01:25

标签: c++ templates inheritance public

如果我有这种层次结构:

#include <iostream>

using namespace std;

template<class T>
class typeB;

template<class T>
class typeA 
{
    // Private data
        T* x_;
        int size_;
    public:
        // Constructors
        typeA()
            : x_(0), size_(0)
        {
        };
        typeA(int size)
            : x_(0), size_(size)
        {
        }

        // Friend classes.
        friend class typeB<T>;
};

template<class T>
class typeB
: public typeA<T>  
{
    public:
        // Constructors
        typeB ()
        {
        };
        typeB (int size)
            : typeA<T>(size)
        {
            //this->x_ = new T[size];
            x_ = new T[size];
        }
};

int main()
{
    typeB<int> b(4);

    return 0;
}

为什么我需要在typeB(int size)构造函数中指定“this-&gt; x_ = new T [size]”而不是“x_ = new T [size]”才能编译此代码?

编译器告诉我的是它无法解析x _:

的类型
main.cpp: In constructor ‘typeB<T>::typeB(int)’:
main.cpp:42: error: ‘x_’ was not declared in this scope

如果typeB是typeA的朋友,它应该具有对typeA属性的公共访问权。如果我尝试使用非模板化的类,它可以工作:

#include <iostream>

using namespace std;

class typeB;

class typeA 
{
    // Private data
        int* x_;
        int size_;
    public:
        // Constructors
        typeA()
            : x_(0), size_(0)
        {
        };
        typeA(int size)
            : x_(0), size_(size)
        {
        }

        // Friend classes.
        friend class typeB;
};

class typeB
: public typeA
{
    public:
        // Constructors
        typeB ()
        {
        };
        typeB (int size)
            : typeA(size)
        {
            x_ = new int[size];
        }
};

int main()
{
    typeB b(4);

    return 0;
}

typeA和typeB是一种列表容器:您认为这种关系的动机是什么(公共继承+朋友,如果需要直接访问,则将x_和size_作为受保护的属性)?

1 个答案:

答案 0 :(得分:3)

首先,成员x_是基类的私有成员。友谊不会有帮助,因为你试图通过继承来访问成员。

即使您使其受保护或公开,模板基类的成员也不会在派生类中自动显示。

解决方案是:

  1. 明确使用this->

     this->x_ = new int[size];
    
  2. 或者将名称带入派生类范围:

     template<class T>
     class typeB : public typeA<T>  
     {
             using typeA<T>::x_; //brings the name x_ into the class scope!
             //...
    

    然后你可以写

     x_ = new int[size];