В Visual C++ я могу делать такие вещи:
template <class T>
class A{
protected:
T i;
};
template <class T>
class B : public A<T>{
T geti() {return i;}
};
Если я попытаюсь скомпилировать это в g ++, я получаю сообщение об ошибке. Я должен сделать это:
template <class T>
class B : public A<T>{
T geti() {return A<T>::i;}
};
Разве я не должен делать первое в стандартном C++? Или что-то неправильно настроено в gcc, что дает мне ошибки?
обман: stackoverflow.com/questions/11405/template-problem-with-gcc





Раньше это было разрешено, но изменилось в gcc 3.4.
В определении шаблона неквалифицированные имена больше не будут находить элементы зависимой базы (как указано в [temp.dep] / 3 в стандарте C++). Например,
template <typename T> struct B {
int m;
int n;
int f ();
int g ();
};
int n;
int g ();
template <typename T> struct C : B<T> {
void h ()
{
m = 0; // error
f (); // error
n = 0; // ::n is modified
g (); // ::g is called
}
};
Вы должны сделать имена зависимыми, например добавив к ним префикс this->. Вот исправленное определение C :: h,
template <typename T> void C<T>::h ()
{
this->m = 0;
this->f ();
this->n = 0
this->g ();
}
Хех ... Вы, должно быть, писали одновременно со мной. Странно, что msvc принимает это, даже если он недействителен (и вызывал странные ошибки времени выполнения).
Да, я увидел ваш пост сразу после того, как нашел примечания к выпуску. Я думаю, что, вероятно, старые версии как gcc, так и vC++ поддерживали неправильный способ. Но gcc решил сделать это правильно, а vC++ решил сохранить обратную совместимость.
Я понял это:
Судя по всему, первый пример НЕ подходит для C++, и плохо, что msvc принимает это. Решения опубликованы в C++ faq lite.
Вы можете прочитать о двухэтапный поиск имени
Какие версии gcc?