using для типов базового класса
От: urandom  
Дата: 16.05.06 08:34
Оценка:
Здравствуйте.

Такой код
#include <iostream>
#include <vector>
using namespace std;
template<typename T> class vct:public vector<T>{
  public:
    using vector<T>::begin;
    using vector<T>::end;
    using typename vector<T>::iterator;
    vct():vector<T>(1){}
    void print(){
        iterator b=begin(),e=end();
        cout<<(e-b);
    }
};
 
int main(){
    vct<int> a;
    a.print();
}


Comeau online, Builder 6 компилят(ну нет у меня MSVC)
GCC не компилит
имеем ошибку в print(iterator — неизвестный тип):
 In member function `void vct<T>::print()':               
12: error: expected `;' before "b"                        
13: error: `e' was not declared in this scope             
13: error: `b' was not declared in this scope             
 In member function `void vct<T>::print() [with T = int]':
19:   instantiated from here                              
12: error: expected primary-expression

проверял на g++ 3.4.5 (mingw special) и g++ 4.0.3 под linux

Кто не прав(я/gcc/comeau)?
Может есть идеи как красиво обойти глюк gcc(если это он)?
(кроме как typedef typename vector<T>::iterator iterator)
Re: using для типов базового класса
От: Lorenzo_LAMAS  
Дата: 16.05.06 09:06
Оценка:
U>Кто не прав(я/gcc/comeau)?
U>Может есть идеи как красиво обойти глюк gcc(если это он)?
U>(кроме как typedef typename vector<T>::iterator iterator)

Это глюк gcc. А вот кроме тайпдефа не знаю, как красиво обойти.
Of course, the code must be complete enough to compile and link.
Re: using для типов базового класса
От: dotidot Россия  
Дата: 19.05.06 01:53
Оценка:
Здравствуйте, urandom, Вы писали:
....
а может не стоит от вектора наследоваться. тем более этот print можно как функцию реализовать.

ну еще могу предложить убрать
using typename vector<T>::iterator;

и добавить:
typedef typename vector<T>::iterator iterator;

тогда всё компиляется. но красоты уже нет.
Re[2]: using для типов базового класса
От: Константин Л.  
Дата: 19.05.06 08:49
Оценка:
Здравствуйте, dotidot, Вы писали:

D>Здравствуйте, urandom, Вы писали:

D>....
D>а может не стоит от вектора наследоваться. тем более этот print можно как функцию реализовать.

D>ну еще могу предложить убрать

D>
D>using typename vector<T>::iterator;
D>

D>и добавить:
D>
D>typedef typename vector<T>::iterator iterator;
D>

D>тогда всё компиляется. но красоты уже нет.

почему нет? есть
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.