LINUX.ORG.RU

gcc : шаблоны, наследование ?


0

0

Доброго времени суток.
Столкнулся с такой проблемой. "gcc" не воспринимает конструкцию:
template <class T> class classB : public classA< T>  {
public:
  ...
  T GetM1(void) { return m_t1; } 
  T GetM2(void) { return m_t2; }            
};

$ g++ test.cpp
test.cpp: In member function ‘T classB<T>::GetM1()’:
test.cpp:15: error: ‘m_t1’ was not declared in this scope
test.cpp: In member function ‘T classB<T>::GetM2()’:
test.cpp:16: error: ‘m_t2’ was not declared in this scope

Код:
//
template <class T>  class classA {
public:
  T  m_t1;
  T  m_t2;
}; // class classA
//
template <class T> class classB : public classA< T>  {
public:
  classB() {}
  ~classB() {}
public:
  T GetM1(void) { return  m_t1; }
  T GetM2(void) { return  m_t2; }
}; // class classB
//
int main(int argc, char **argv)
{
  int retCode=0;
  classB<int>  regInt;
  return retCode;
} // main()
/* EOF */

gcc version 4.0.0 20050519 (Red Hat 4.0.0-8)
Я проверил на VC++ - все работает.
Может я что то не знаю, подскажите, если не сложно.
Раньше я обходил такие штуки, не использовал наследование в шаблонах.
gcc не поддерживает наследование в шаблонах ?
anonymous

Ответ на: комментарий от BreadFan

Пункт стандарта 14.6.2. Вкрадце -- у тебя эти переменные зависят от параметра шаблона, откуда компилятор догадается откуда их брать?

Reset ★★★★★
()
Ответ на: комментарий от Reset

я и пользуюсь g++. Я же написал в топике.

$ g++ test.cpp
test.cpp: In member function ‘T classB<T>::GetM1()’:
test.cpp:15: error: ‘m_t1’ was not declared in this scope
test.cpp: In member function ‘T classB<T>::GetM2()’:
test.cpp:16: error: ‘m_t2’ was not declared in this scope

> у тебя эти переменные зависят от параметра шаблона, откуда компилятор 
> догадается откуда их брать?

А почему он не должен знать ?
Я же создаю объект:

int main(int argc, char **argv)
{
  int retCode=0;

  classB<int>  regInt;    // <--- !!!!

  return retCode;
} // main()

Или этого не достаточно ?

> чтобы решить проблему можно написать classA< T >::m_t1
Не совсем понял, расскажите по подробнее ?

> объяснить стандартом C++
Я же написал что не знаю стандарт, что трудно подсказать
что делать, весь код переписывать?
Почему VC++ подерживает - это особенность VC++
 - не стандартизованные расширения ?
Или это компилятор gcc(g++) не поддерживает такие штуки ?
Я давно уже знаю эту особенность, но сейчас не знаю что делать.
Или я не знаю что-то в С++ или gcc(g++) не поддерживает.
Вот и спросил, не ужели сложно ответить, если знаете ?

anonymous
()

У меня тоже самое! :( Пытаюсь гуглить, но надеюсь на ответы гуру ;) Если ответ найду, обязательно подскажу. Удач!

anonymous
()
Ответ на: комментарий от anonymous

Причем проблема именно с шаблонами и именно с gcc. Без шаблонов все компилится отлично. На Borland C++ Compiler (с шаблонами) тоже все компилится.

anonymous
()
Ответ на: комментарий от dilmah

В теле описания classB нужно написать : T GetM1(void) { return classA< T >::m_t1; }

тогда компилляция проходит успешно. А стандарты ни при чем!

anonymous
()
Ответ на: комментарий от anonymous

в главах [class.derived] и [class.access] ничего не написано про шаблоны.

Я просмотрел главу [template] -- там эта ситуация никак не освещается.

dilmah ★★★★★
()
Ответ на: комментарий от anonymous

>ем проблема именно с шаблонами и именно с gcc. Без шаблонов все >компилится отлично. На Borland C++ Compiler (с шаблонами) тоже все >компилится.

Просто BC не проверяет синтактическую корректность до этапа инстанцированния шаблона, а g++ это делает, Comeau наверное тоже умеет делать, а вот компиляторы от M$ и Borland не до конца следуют стандарту, это впрочем понятно, первая сейчас концетрируется на C#, а вторая всегда ставила Delphi во главу угла.

fghj ★★★★★
()
Ответ на: комментарий от anonymous

>Я же создаю объект:

синтактическая правильность кода проверяется до создания, или как это называют инстанцирования из шаблона класса.

fghj ★★★★★
()

да кстати говорят VC++ и такое компилит без проблем,
сейчас нет под рукой VC чтобы проверить:
template <class T>
struct _
{
void f() { Chto hochu, to i pishu. Vot. I ne fig parsit eto }
};

fghj ★★★★★
()
Ответ на: комментарий от anonymous

>gcc = GNU C Compiler где ты видешь здесь фразу <с++> ?

>пользуй g++

Прочитай ман сначала, прежде чем постить подобные сообщения

anonymous
()
Ответ на: комментарий от fghj

>>да кстати говорят VC++ и такое компилит без проблем, сейчас нет под рукой VC чтобы проверить: template <class T> struct _ { void f() { Chto hochu, to i pishu. Vot. I ne fig parsit eto } };

Компилит ))))

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.