[linux-l] C++ - <vector> ...
Axel Weiß
aweiss at informatik.hu-berlin.de
So Mai 29 10:31:39 CEST 2005
Am Samstag, 28. Mai 2005 23:56 schrieb JSC:
> Hallo,
>
> ich bekomme mit dem g++ 3.4.3 meinem mp3blaster nicht mehr uebersetzt.
> mit g++ 2.96 ging es noch prima.
>
> Fehlermeldung:
> In file included from main.cc:29:
> history.h:24: error: ISO C++ forbids declaration of `vector' with no
> type history.h:24: error: expected `;' before '<' token
> main.cc: In function `void fw_start_search(int)':
> main.cc:3649: error: default argument given for parameter 1 of `void
> fw_start_search(int)' main.cc:135: error: after previous specification
> in `void fw_start_search(int)'
>
> Der zugehoerige Code:
> [..]
> #include <vector>
>
> class History
> {
> public:
> History();
> ~History();
>
> short add(const char*);
> short atEnd();
> short atStart();
> void previous();
> void next();
> const char *element();
>
> private:
> vector<char *> v;
> unsigned int curpos;
> std::vector<char *>::iterator it;
> };
> [..]
>
> Zeile 24 ist die Zeile mit der Variable 'v'.
>
> Leider entwickelt der Autor sein Programm scheinbar nicht weiter. In
> google hab ich nur dumme Antworten ("Du hast <vector> nicht
> includiert") oder unbeantwortete Fragen gefunden. Die <> notation ist
> mir voellig unbekannt und einen iterator kenne ich auch nicht
> persoenlich.
Hi Jens,
versuch mal
std::vector<char *> v;
bzw. ein
using namespace std;
unmittelbar nach der include-Anweisung.
> Irgendwas steht in: http://gcc.gnu.org/bugs.html#fixed34
> (nach "implicit typename" suchen)
> Leider versteh ich nicht, was man da von mir will.
>
> Kurz: ich bin mit meinen c kenntnissen am ende und koennte hilfe
> gebrauchen.
Das hier ist C++ ;)
Der gcc-3.4 will (im Gegensatz zum alten gcc-2.95) die explizite Angabe
für Namespaces, wie das im C++-Standard vorgesehen ist. Du kannst jetzt
nicht mehr sowas schreiben;
#include <iostream>
...
cout << ... << endl;
sondern musst eine der drei folgenden Varianten einsetzen:
1. Pauschale Einbindung des Namespaces std:
#include <iostream>
using namespace std;
...
cout << ... << endl;
2. Einbindung ausgewählter Symbole aus dem Namespace std:
#include <iostream>
using std::cout;
using std::endl;
...
cout << ... << endl;
3. Auflösen des Namespace bei Benutzung:
#include <iostream>
...
std::cout << ... << std::endl;
Es kann sein, dass Du sehr viele Änderungen an den Quellen vornehmen
musst, damit der gcc-3.4 das schluckt.
BTW: ein Typname, der <> enthält (z.B. vector<char*>) ist die Instanz
eines Templates 'vector', der mit dem Typ 'char*' parametrisiert ist.
Das dahinterliegende Konzept heißt Polymorphie.
Gruß,
Axel
--
Humboldt-Universität zu Berlin
Institut für Informatik
Signalverarbeitung und Mustererkennung
Dipl.-Inf. Axel Weiß
Rudower Chaussee 25
12489 Berlin-Adlershof
+49-30-2093-3050
** www.freesp.de **
Mehr Informationen über die Mailingliste linux-l