Доступ к защищенному члену класса в производном классе - PullRequest
9 голосов
/ 26 октября 2009

У меня есть старая кодовая база, где они использовали защищенные переменные-члены. Является ли это хорошей идеей, можно обсудить. Тем не менее, код должен быть скомпилирован нормально с gcc3. У меня есть производный шаблон класса Bar, который использует защищенный член x из шаблона класса Foo, например,

template <class Something> class Foo {  
public:  
// stuff...  
protected:  
  some::type x;  
}

template <class Something> Bar : Foo<Something> {
public:
  void cleanup();
}

А в объявлении метода cleanup () что-то делается с x

template <class Something> void Bar<Something>::cleanup() {
  doSomeThingCleanUpLike (x);
}

Это не работает с gcc4, хотя должно было работать с gcc3. Это работает, когда я изменяю его на

doSomeThingCleanUpLike (this->x);

Почему это так?

Ответы [ 2 ]

13 голосов
/ 26 октября 2009

Выражение x, используемое в производном классе, по правилам стандарта не зависит от какого-либо параметра шаблона производного класса. Из-за этого поиск происходит в контексте определения шаблона, а не в момент его использования / создания. Несмотря на то, что базовый класс шаблона шаблона кажется видимым, поскольку это класс шаблона, конкретная реализация, которая может использоваться, может включать специализированные шаблоны, поэтому определение шаблона базового класса нельзя использовать для поиска имени.

Изменяя выражение на this->x, вы делаете его зависимым выражением (this в шаблоне класса всегда зависит от параметров шаблона). Это означает, что поиск будет происходить в контексте экземпляра, после чего базовый класс будет полностью известен, и его члены будут видны.

6 голосов
/ 26 октября 2009

Когда вы определяете производный шаблон, компилятор знает только имя базового класса шаблона, но не его данные, поэтому компилятор не знает, что производный класс имеет унаследованный член. Чтобы сообщить компилятору о существовании члена, используйте this->, как и вы.

На самом деле, это дубликат этого вопроса .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...