2015-07-05 4 views
2

Я хочу, чтобы получить доступ к защищенному переменной в родительском классе, у меня есть следующий код и он отлично компилируется:не удается получить доступ к переменной в шаблоне базового класса

class Base 
{ 
protected: 
    int a; 
}; 

class Child : protected Base 
{ 
public: 
    int b; 
    void foo(){ 
     b = a; 
    } 
}; 

int main() { 
    Child c; 
    c.foo(); 
} 

Хорошо, теперь я хочу, чтобы все шаблонный. Я изменил код на следующий

template<typename T> 
class Base 
{ 
protected: 
    int a; 
}; 

template <typename T> 
class Child : protected Base<T> 
{ 
public: 
    int b; 
    void foo(){ 
     b = a; 
    } 
}; 

int main() { 
    Child<int> c; 
    c.foo(); 
} 

И получил ошибку:

test.cpp: In member function ‘void Child<T>::foo()’: 
test.cpp:14:17: error: ‘a’ was not declared in this scope 
      b = a; 
       ^

ли это правильное поведение? Какая разница?

Я использую г ++ 4.9.1

ответ

3

Хехе, мой любимый C++ странность!

Это будет работать:

void foo() 
{ 
    b = this->a; 
//  ^^^^^^ 
} 

Безусловный поиск здесь не работает, потому что база является шаблоном. That's just the way it is, и сводится к очень техническим деталям о том, как транслируются программы на C++.

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