[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