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