"Mehrfachdefinition" bei Verwendung von (Schein-) Header-Dateien für Vorlagen
Mir ist bekannt, dass Definitionen von C ++ - Funktionen in Headerdateien abgelegt werden müssen. Aus Gründen der besseren Lesbarkeit und Struktur einer (potenziell) großen Bibliothek, die ich mache,Ich habe die Deklarationen von den Implementierungen in "Schein" -Header getrennt (welche#include
die Implementierungsdateien, ganz wiediese Struktur von Dateien).Beachten Sie, dass ich mir bewusst bin, dass dieDie Implementierung von Vorlagenfunktionen muss enthalten sein zur Kompilierungszeit, und das mache ich.
Zusamenfassend,Ich habe einen "Mehrfachdefinitions" -Fehler, wenn ich der Implementierungsdatei eine Funktionsdeklaration ohne Vorlage hinzufüge. Es folgt eine lange Erläuterung mit Beispielen.
Wenn das Paar "Mock" -Header + ImplementierungsdateienEnthält nur das Deklarations- / Implementierungspaar der Template-Funktion, alles funktioniert gut. Es funktioniert auch gut, wennIch füge eine Implementierung einer neuen Template-Funktion nur in der Implementierungsdatei hinzu.
Arbeitsbeispiel (ich würde#include "algo.h"
in meinemmain.cpp
als ich diese Funktionalität nutzen wollte):
Header-Datei "Mock" algo.h:
#ifndef ALGO_H
#define ALGO_H
namespace fl{
template <typename Compare>
void algo(.. non-templated args .., Compare order = std::less<int>());
}
#include "tpp/algo.cpp"
#endif // ALGO_H
Implementierungsdatei tpp / algo.cpp: (derzeit nuralgo.tpp)
Hinweis: Verwendung dertpp/.cpp
Datei war in der Anfangsversion, jetzt benutze ich eine.tpp
Datei per@ πάντα ῥεῥVorschlag, Erklärung am Ende.
#ifndef TPP_ALGO
#define TPP_ALGO
#include "../algo.h"
namespace fl{
template <typename Compare>
void subFunctionality(Compare order, .. args ..){ /* impl */ }
template <typename Compare>
void algo(.. non-templated args .., Compare order){
subFunctionality(order, .. args ..);
// implementation
}
}
#endif // TPP_ALGO
Das Problem entstehtwenn ich der Implementierungsdatei eine nicht als Vorlage dienende Funktionsimplementierung hinzufüge. (Nicht funktionierendes) Beispiel für dietpp / algo.cpp (derzeit nuralgo.tpp) (mit dem gleichenalgo.h):
#ifndef TPP_ALGO
#define TPP_ALGO
#include "../algo.h"
namespace fl{
template <typename Compare>
void subFunctionality(Compare order, .. args ..){ /* impl */ }
void moreSubFun(.. args ..) { /* impl */ }
template <typename Compare>
void algo( .. non-templated args ..., Compare order){
subFunctionality(order, .. args ..);
moreSubFun(.. args ..);
// more stuff
}
}
#endif // TPP_ALGO
Ich bekomme die"multiple definition" Fehler (von wo ich ihn eingefügt habe)main.cpp
), wie folgt:
obj/Release/main.o In function `fl::moreSubFun(...)':
main.cpp multiple definitions of `fl::moreSubFun(..)'
obj/Release/../tpp/algo.o:algo.cpp first defined here
Warum passiert dies nur bei nicht vorlagenbasierten Funktionen, während es für die vorlagenbasierten Funktionen gut funktioniert?, und noch wichtiger,Wie löse ich dieses Problem?
Ich habe mich so umgesehen, und ich kann nichts Nützliches finden :( Im Idealfall suche ich etwas, das meiner eigenen Dateistruktur so nahe wie möglich kommt (aber ich nehme alles, was funktioniert, während ich immer noch etwas Separation in "Mock" verwende ".h
+ tpp/.cpp
). Muss ich die zusätzlichen Unterfunktionen in einem separaten, nicht vorlagenbasierten Paar zusammenfassen?.h/.cpp
Dateien, oder gibt es andere Lösungen? (Die Unterfunktionen sollten für den Endbenutzer im Idealfall nicht sichtbar sein.)
Ich bin nur ungern zu verwendeninline
bei der Definitionfl::moreSubFunc(..)
da die funktion ziemlich groß ist (und mir beigebracht wurde)inline
sollte idealerweise nur mit kleinen Funktionen verwendet werden). Dies löst das Problem, aber ich suche nach einer anderen Lösung.
Ich arbeite inCode::Blocks
mitgcc version 4.7.2
. Dies ist der ursprüngliche Grund für meine Implementierungsdateitpp/.cpp
(.cpp
Verlängerung), seitCode::Blocks
unterstützt es nicht standardmäßig. Dies wird in der aktuellen Implementierung nachfolgend geändert@ πάντα ῥεῥVorschlag (siehe unten).
Späte Bearbeitung (Nachdem ich unterrichtet hatte, wurde die Lösung gefunden) Ich unterrichtete@ πάντα ῥεῥs Antwort löst das Problem. Ich habe gezwicktCode::Blocks
akzeptieren.tpp
Dateien (entweder alsHeader oderQuelle Dateien). Anfangs hat diese Lösung funktioniert.
Jedoch,Diese Lösung funktionierte nur, wenn diealgo.h Datei war nur in einer anderen Datei enthalten: als ich es nur in aufgenommen habemain.cpp. Sobald ich jedoch versuchte, es in eine andere Quelldatei aufzunehmen (z.algo2.cpp), die diese Algorithmen verwenden würden (zusätzlich zumain.cpp), dasMehrfachdefinition Problem kam zurück.
Endeffekt,Das Problem besteht immer noch, sobald ich diealgo.h in mehr als einer Datei, und ich suche noch nach einer lösung.