"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::Blocksmitgcc 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.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage