Доступ к защищенному члену класса в производном классе

StackOverflow https://stackoverflow.com/questions/1624564

Вопрос

У меня есть старая кодовая база, где они использовали защищенные переменные-члены. Является ли это хорошей идеей, можно обсудить. Тем не менее, код должен быть скомпилирован нормально с 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);

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

Это было полезно?

Решение

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top