Vanliga frågor och svar - 2D1387, Programsystemkonstruktion med
C++
Labb
Q5. Vilken kompilator skall jag använda? Det står gcc 3.0 i labbpeket.
A5. Det står fel i labbpeket, du skall använda gcc/3.2.1. Den får du tag i genom att skriva module add gcc/3.2.1 eller genom att använda course join-kommandot: course join cprog03
Q4. Jag får inte igång DDD. Vad kan vara fel?
A4. Det kan vara så att du behöver skriva
~> module add emacs/21.1
för att få det att fungera. Om det fortfarande inte
fungerar, pröva då också med
~> module add gdb
Q3. Varför hittar inte kompilatorn konstruktor till min
template-klass?
A3. Se A1.
Q2. Varför kan jag inte kompilera min template-klass?
A2. Se A1.
Q1. Vad betyder följande felmeddelande när jag kompilerar
min mall:
Undefined
first referenced
symbol
in file
My_vector<double>::sort(bool)
/var/tmp//ccAQ1zZg.o
My_vector<double>::~My_vector [in-charge]()/var/tmp//ccAQ1zZg.o
My_vector<double>::My_vector[in-charge]()/var/tmp//ccAQ1zZg.o
ld: fatal: Symbol referencing errors. No output written to a.out
collect2: ld returned 1 exit status
A1. Templates måste vara synliga vid kompileringstillfället,
dvs man
kan inte kompilera dem separat (typ g++ -c vector.cpp). Ni måste
därför se till att alla (filer) som använder vector.h också
ser det
ni vill ha i vector.cpp. En lösning är att skriva allt i vector.h,
men det är fult. Något snyggare är att sist i vector.h
skriva
#include "vector.cpp" (det är då lämpligt att inte skriva
#include
"vector.h" i vector.cpp). Istället för:
g++ -c vector.cpp
g++ -o test main.cpp vector.o
Skriver ni nu:
g++ -o test main.cpp
Riktigt snyggt är att använde nyckelordet export (export
template<class T> class Vector {....), men g++ hanterar inte export,
så det fungerar inte på Nada.
Tillbaka till hemsidan
Senast uppdaterad: 2003-09-05
av Ronnie Johansson