"Język C++" B.Stroustrup, błąd kompilacji

0
template<class T> class Vec :  public vector<T> {
public :
    Vec () : vector<T> () { }
    Vec (int s) : vector<T> (s) { }
    
    T& operator[] (int i) { return at(i) ; }
    const T& operator[] (int i) const { return at(i) ; }  

Bjarne Storustrup, "Język C++", rozdział 3, punkt 3.7.2.
Przy kompilacji błąd jest w pierwszej linijce
Dołączyłem do kodu nagłówek z <vector>.
A jako że jestem dociekliwy, nie omine przykładu póki nie dowiem się co jest nie tak ; )

Z góry dzięki za wszelką pomoc : )

Pozdrawiam !</email>

0
Laurearel napisał(a)

A jako że jestem dociekliwy, nie omine przykładu póki nie dowiem się co jest nie tak ; )

Wiesz, to Stroustrup stworzył C++, bierze udział w tworzeniu kolejnych standardów, chyba wie co pisze, prawda?

Od wydania ostatniej edycji książki nieco się zmieniło, to różnica pomiędzy 'starym' C++ a obecnym standardem, jedna z kilku. GCC jest niby liberalny (przez swoje rozszerzenia) ale tego nie łyka, w praktyce powinien przy braku wymuszenia zgodności z konkretnym standardem. Nawet w Comeau bez strict ISO-03 to przechodzi (w CL z VC++ oczywiście tak samo).

Żeby to chodziło to trzeba jasno określić do jakiego at się odwołujemy (kwestia dziedziczenia z szablonu):

  T& operator[] (int i) { return this->at(i); }
  const T& operator[] (int i) const { this->at(i); }

  // albo

  T& operator[] (int i) { return vector<T>::at(i); }
  const T& operator[] (int i) const { vector<T>::at(i); }

Po prostu język jest nieco bardziej restrykcyjny niż kiedy książka powstawała, chociaż różnic pomiędzy knigą a obecnym standardem jest raptem kilka, do tego drobnych.

0

wiem ; ) W końcu chyba wiem czemu kupiłem tą pozycję ; )

Rzecz w tym że nawet jak okomentuje środek szablonu, ciągle jest ten sam błąd ; / ( w dev i code::blocks)

0

Przetestuj to:

#include <vector>
using std::vector;

template<class T> class Vec : public vector<T> {
public:
  Vec() : vector<T>() { }
  Vec(int s) : vector<T>(s) { }

  T& operator[] (int i) { return this->at(i); } // range-checked
  const T& operator[] (int i) const { return this->at(i); } // range-checked
};

int main() {
  Vec<int> v(69);
}

Aktualnie mam pod ręką jedynie MinGW/GCC 4.4.1, Ty zapewne to archaiczne i zbugowane 3.4.2, u mnie w/w kod działa idealnie, podaj jaki to błąd to badziewie wypluwa.

0

PLD Linux, g++ na 4.3.3 oraz 4.4.2 - ostatni kod poprawny, wczesniejsze nie
winxp pro, visual studio 2008 pro sp1 - przyjmuje kod takze z "return at(i); ", ale nim bym sie nie sugerowal

0

Moje 'wcześniejsze' są poprawne, po prostu poprawiają to, do czego się GCC doczepi. Nie przyjrzałem się dokładnie czy autor przepisał poprawnie... po prostu przekopiowałem kod z książki, dla pewności.

Co do Visuala, łyknie dlatego, że robi pełną analizę przed rozwiązaniem odwołań do składowych, wbrew temu co standard mówi - jest inteligentniejszy. Co ciekawe, nie można go zmusić do patologicznego - zgodnego ze standardem - zachowania.

0

o, a tego o VS nie wiedzialem.
pod "poprawny" mialem na mysli "nie bylo bledow kompilacji", sorry za niescislosc

0

Problem(y) (bo dwa) rozwiązane, jeden byk przez własne niedopatrzenie, drugi bo jakoś nie wpadłem na pomysł z this-> , muszę się jeszcze wiele nauczyć , ale każdy program to dodatkowe doświadczenie ; )

Temat można zamknąć ; )

1 użytkowników online, w tym zalogowanych: 0, gości: 1