2016-09-01 4 views
2

Я хочу использовать атрибут, определенный в базовом классе шаблона A в методе производного класса шаблона B.
До сих пор я нашел using работ.
Но запись инструкции using для каждого атрибута A является утомительной.
Как избежать написания стольких using заявлений?Атрибут доступа базового класса шаблона без «использования»

#include <iostream> 

using namespace std; 

template <typename T> 
class A{ 
    public: 
     A(){ 
      a = 10; 
     } 
     //virtual destructor 
     virtual ~A(){ 
      cout << "~A() is called" << endl; 
     } 
    protected: 
     T a; 
} ; 

template <typename T> 
class B : public A<T>{ 
    public: 
     void f(void){ 
      cout << a << endl; 
     } 
     virtual ~B(){ 
      cout << "~B() is called" << endl; 
     } 
    private: 
     using A<T>::a; //how to get rid of this? 
} ; 

int main(void){ 
    B<int> bb; 
    bb.f(); 
} 

ответ

4

Поскольку вы расширяете класс, зависящий от параметра шаблона, this становится зависимым именем. Вы должны использовать this явно:

template <typename T> 
struct B : A<T>{ 
    void f(){ 
     std::cout << this->a << std::endl; 
    } 
}; 

Или вы даже можете указать имя класса:

template <typename T> 
struct B : A<T>{ 
    void f(){ 
     std::cout << A<T>::a << std::endl; 
    } 
}; 

Третье решение, конечно же, в using заявление.

+4

* "// как избавиться от этого [используя]?" *: By ** используя ** 'this'^_ ^ – Jarod42

2
// how to get rid of this? 

Вы можете написать

void f(void){ 
     cout << A<T>::a << endl; 
    } 

или

void f(void){ 
     cout << this->a << endl; 
    } 

, чтобы избавиться от using заявления.

Смежные вопросы