machen ein makefile für eine Vorlage-Klasse
So, ich habe einige Dateien, die ich möchte zu kompilieren zusammen. Einer von Ihnen ist der stack.h mit stack.cpp enthalten.
Das folgende ist meine header-Datei:
#include<iostream>
#ifndef STACK_H
#define STACK_H
template <class ItemType>
class StackType
{
public:
//code
private:
//code
};
#include "stack.cpp"
#endif
Folgende ist stack.cpp:
#include "stack.h"
#include <iostream>
using namespace std;
template<class ItemType>
StackType<ItemType>::StackType(){
top = -1;
MAX_ITEMS = 200;
}
//other codes
}
Wenn ich machen Sie sagt, ich bin die Neudefinition der code in stack.cpp
Folgende ist mein Makefile:
main.o: main.cpp stack.h
g++ $(CFLAGS) -c -o main.o main.cpp
stack.o: stack.cpp stack.h
g++ $(CFLAGS) -c -o stack.o stack.cpp
Sehe ich nicht, was das problem ist.
- Was sagt Sie definieren code? Poste bitte die genaue Fehlermeldung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie nicht versuchen zu kompilieren
stack.o
. Dies ist template-code, die enthalten sein müssen in den client-code und kann nicht gebaut werden. Fügen Sie einfach diestack.cpp
Abhängigkeit dermain.o
Regel (vorausgesetzt, main.cpp enthältstack.h
, und entfernen Sie diestack.o
Regel:Haben Sie ein weiteres problem, und das ist, dass Sie
stack.h
imstack.cpp
, und Umgekehrt. Sie sollten entfernen Sie die#include stack.h
ausstack.cpp
.Da template-code nicht kompiliert werden soll, durch sich selbst, ich schlage vor, ändern Sie das suffix der
stack.cpp
zu etwas anderem, wie.icpp
.Die Idee der Trennung von Ihrem interface und Implementierung, auch für Vorlagen, ist eine respektable Stellung zu nehmen. Vielleicht schlage ich aber, dass Sie nicht aufrufen, template Umsetzung-Dateien .cpp-Dateien. Boost verwendet ipp diesem Fall scheint es mir vernünftig.
Du hast das richtige zu tun, einschließlich der it, nur das falsche, was bei der Zusammenstellung...das die .cpp geben würde, die Sie tun sollten.