PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [c++] linken - undefined reference zur Methode im Destructor



waldy
16-05-2010, 08:46
Hallo,

ich sitzte schon seit Tagen an diesem Linking Problem und hab auch schon ausgiebig die Suchfunktion des Forums benutzt aber komme trotzdem nicht auf eine Loesung.

Problem:


/tmp/ccKrBmkN.o: In function `TMatrix<double>::~TMatrix()':
main.cpp:(.text._ZN7TMatrixI7adoubleED1Ev[TMatrix<double>::~TMatrix()]+0x1e): undefined reference to `TMatrix<double>::DelMatrix()'
collect2: ld returned 1 exit status

Das eigentliche Programm ist recht gross, daher hab ich mir ein Modell gebastelt, das nur den noetigsten Code enthaelt und den Fehler produziert.
Laut dem Forum koennte ich in die "matrix.h" Datei die Zeile "#include "matrix.cpp" " einfuegen und damit loest sich das Problem tatsaechlich, allerdings nicht im eigentlichen Programm.

Ich bin hier ueber Hinweise gestossen, dass es ein haeufiges Problem ist, aber keine Loesung dafuer.

Ich kompiliere mit:


g++ matrix.cpp main.cpp


Offenbar fehtl da irgendwas wogegen ich linken muss.


Hier der Modellcode.



//matrix.h
#ifndef MATRIX_H
#define MATRIX_H

#include <stdlib.h>
#include <stdio.h>

template<class T> class TMatrix
{

public:
int cols, rows;
int ElementSize;
T **p;
int SleepFlag;

TMatrix(){
cols=0;
rows=0;
p =0;
SleepFlag=0;
ElementSize = sizeof(T);
};

~TMatrix(){
if (p!=0){
DelMatrix();
}
};

void DelMatrix();
void DelMat(){ DelMatrix(); };
};

#endif


//matrix.cpp

#ifndef MATRIX_CPP
#define MATRIX_CPP

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include "matrix.h"

template<class T>
void TMatrix<T>::DelMatrix()
{
if (p!=0){
delete[] p[0];
delete[] p;
};
rows=0;
cols=0;
p =0;
SleepFlag=0;
};

#endif

//main.cpp
#include "matrix.h"

int main(){

TMatrix<double> tm;


return 0;
}



Ich hoffe jemand hat einen kleinen Hinweis fuer mich, was man da machen koennte.

Danke.
Gruss,
waldy

undefined
16-05-2010, 10:09
Weil du in der Header ein Methode definierst aber diese nicht im Quelltext verwendest bekommst du diese Meldung.

locus vivendi
16-05-2010, 14:21
... Die Konsequenz daraus ist, daß du nicht umhin kommen wirst auch in main.cpp matrix.cpp zu inkludieren.

Um deutlich zu machen, daß es sich um nicht separat zu kompilierenden Quellcode handelt, könntest du noch matrix.cpp in matrix_def.h, oder matrix_def.cpp oder matrix_templates.hh oder ähnliche umbennen.