PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : g++ Template einbinden



Claudine
23-07-2003, 21:32
folgender Code wird mit Dev-C unter Windows ohne Fehler kompiliert.
Unter Linux mit gcc version 3.2 klappt es leider nicht.

Muß ich einen bestimmten Parameter angeben damit das Template gefunden wird?

#include <iostream>
using namespace std;

#include "/home/Claudine/C++/template.h"
int main(int argc, char *argv[])
{

int a = 1;
int b = 2;
double x =3;
double y =4;
swap( a, b);
cout << a << "\n";

swap( x, y);
cout << x << "\n";

return 0;
}
++++++++++++++++++++++++++
template.h
// klappt beides nicht
// template<class T> void swap( T &left, T &right)
template<typename T> void swap( T &left, T &right)
{
T temp;

temp = left;
left = right;
right = temp;
}

wraith
23-07-2003, 21:40
Was meinst du mit 'nicht gefunden' ?
Meckert er bereits,das er deinen Header "template.h" nicht findet?
Pack' den Header mal in das Verzeichnis,wo auch deine main.cpp ist.

Btw, swap hättest du nicht selber schreiben müssen ^^,und wenn wäre es besser einen anderen Namen zu wählen.

Claudine
23-07-2003, 21:58
Original geschrieben von wraith
Was meinst du mit 'nicht gefunden' ?
Meckert er bereits,das er deinen Header "template.h" nicht findet?
Pack' den Header mal in das Verzeichnis,wo auch deine main.cpp ist.

Btw, swap hättest du nicht selber schreiben müssen ^^,und wenn wäre es besser einen anderen Namen zu wählen.

Die Pfade stimmen alle. template.h + test.cpp befindet sich beide im selben Verzeichnis.

Hier die Fehlermeldung:

test.cpp: In function `int main(int, char**)':
test.cpp:13: call of overloaded `swap(int&, int&)' is ambiguous
/home/Claudine/C++/template.h:2: candidates are: void swap(T&, T&) [with T = int]
/usr/include/g++/bits/stl_algobase.h:121: void std::swap(_Tp&,
_Tp&) [with _Tp = int]
test.cpp:16: call of overloaded `swap(double&, double&)' is ambiguous
/home/micha/Claudine/template.h:2: candidates are: void swap(T&, T&) [with T =
double]
/usr/include/g++/bits/stl_algobase.h:121: void std::swap(_Tp&,
_Tp&) [with _Tp = double]

Berufspenner
23-07-2003, 22:06
Die Pfade stimmen alle. template.h + test.cpp befindet sich beide im selben Verzeichnis Nur so am Rande: wenn sich beide Datein im selben Verzeichnis befinden, dann brauchts du nicht den absoluten Pfad der Headerdatei angeben.

Cu
André

wraith
23-07-2003, 22:34
Jo,also bei deinen Fehlermeldungen greift mein zweiter Kommentar


Btw, swap hättest du nicht selber schreiben müssen ^^,und wenn wäre es besser einen anderen Namen zu wählen.

Benenne dein swap mal um,oder nimm' das using namespace raus.

Claudine
24-07-2003, 07:28
So ein Theater...
Bei mir hat es nur geklappt, wenn ich den Prototyp in die header Datei schreibe, und gleichzeitig die template Funktion als modul include. Erst dann hat der g++ die Pfade richtig gefunden.


Original geschrieben von wraith
Jo,also bei deinen Fehlermeldungen greift mein zweiter Kommentar

Benenne dein swap mal um,oder nimm' das using namespace raus.

Gehört swap zu den reservierten Wörtern? Oder warum sollte ich die Funktion umbenennen?

Wirkt es sich auf die Ausführungsgeschwindigkeit und Speicher aus, wenn ich ohne using namespace arbeite?
Lohnt sich der Aufwand nur die Funktionen mit std:: einzubinden die man braucht?
std::cout << "max: " << *pos << std::endl;

wraith
24-07-2003, 10:05
Original geschrieben von Claudine

Bei mir hat es nur geklappt, wenn ich den Prototyp in die header Datei schreibe, und gleichzeitig die template Funktion als modul include. Erst dann hat der g++ die Pfade richtig gefunden.


Deine Fehlermeldungen hatten rein garnichts mit Pfadproblemen zu tun.
Vielleicht hast du durch deine Aktionen den 'echten' Fehler verdeckt,und es läuft jetzt.



Gehört swap zu den reservierten Wörtern? Oder warum sollte ich die Funktion umbenennen?

swap ist eine template Funktion aus der STL,die genau das macht was dein swap auch macht.
Und jetzt sehen wir uns mal deine Fehlermeldungen an
>>test.cpp:13: call of overloaded `swap(int&, int&)' is ambiguous
Aha,der Aufruf von swap ist mehrdeutig,und zwar haben 2 Kandidaten zwischen denen der Compiler nicht entscheiden kann
>>/home/Claudine/C++/template.h:2: candidates are: void swap(T&, T&) [with T = int]
Dein swap
>>/usr/include/g++/bits/stl_algobase.h:121: void std::swap(_Tp&,_Tp&) [with _Tp = int]
Und das swap aus der STL
Das liegt standardmäßig im namespace std,aber du hast mit using namespace std,alles was in std liegt in den globalen namespace gepackt,und hier kollidiert es mit deinem swap.



Wirkt es sich auf die Ausführungsgeschwindigkeit und Speicher aus, wenn ich ohne using namespace arbeite?
Lohnt sich der Aufwand nur die Funktionen mit std:: einzubinden die man braucht?
std::cout << "max: " << *pos << std::endl;
Das sind alles Sachen,die zur Compilezeit aufgelöst werden.Also gibt es zur Laufzeit keinen Overhead (der generierte Code ist identisch).
Es ist besser immer nur die Symbole zu importieren,die man wirklich braucht,also


#include <iostream>

using std::cout;
using std::endl;

int main()
{
cout << "Hello World" << endl;
}

anda_skoa
24-07-2003, 10:08
Original geschrieben von Claudine
Gehört swap zu den reservierten Wörtern? Oder warum sollte ich die Funktion umbenennen?


Nein, aber es gibt sowas schon im Namespace std (siehe auch deine Compilerfehlermeldung)
Da du den Namespace geöffnet hast, konnte der Compiler nicht mehr sichergehen, welche der beiden swap Funktionen du meinst.



Wirkt es sich auf die Ausführungsgeschwindigkeit und Speicher aus, wenn ich ohne using namespace arbeite?


Das ist nur eine Codefrage, nach dem Compiler gibt es da keine Unterschiede mehr.



Lohnt sich der Aufwand nur die Funktionen mit std:: einzubinden die man braucht?
std::cout << "max: " << *pos << std::endl;

Wenn du Namen hast, die gleich lauten wie Namen im Namespace, kann es besser sein, nur die benötigten Symbole bekannt zu machen.

Oder du schreibst bei den doppelten Symbolen den Namespace vorne dran.

Alles eine Frage wie übersichtlich du es haben willst und was du als übersichtlicher empfindest und du das konsequent im ganzen Projekt machst.

Ciao,
_

anda_skoa
24-07-2003, 10:11
Original geschrieben von Claudine
Die Pfade stimmen alle. template.h + test.cpp befindet sich beide im selben Verzeichnis.


Ich denke wraith meinte damit auch, dass du #includes nicht mit absoluten Pfaden benutzen solltest, sondern mit relativen.

Wenn die Dateien eh im selben Verzeichnis sind reicht "name.h"

Ciao,
_

Claudine
24-07-2003, 12:05
Erst mal vielen Dank für eure Hilfe. Leider stehen solche Feinheiten nicht in meinen Bücher. Die ersten Gehversuche nach 2 Wochen C++ sind halt noch etwas schwer.

Jetzt verstehe ich auch, warum es so viele geparste Programmiersprachen gibt. Der Hauptvorteil liegt wohl in der Kompatibilität und geringen Entwicklungszeit. Schreib ich ein kleines Programm in C++ sitze ich bis jetzt noch 1 Tag daran. Das selbe in PHP, .sh oder .awk dauert max. 1 Stunde.