sagen, dass ich eine Template-Klasse A
in a.h
Warum Position expliziter Vorlage Instanziierung Materie
#include <iostream>
template<bool b>
class A {
public:
void print(std::ostream& out);
};
erklären und die Druckmethode in a.cpp
(mit expliziter instatiation für true
und false
)
#include "a.h"
template<bool b>
void A<b>::print(std::ostream& out) {
out << "A" << b;
}
template class A<true>;
template class A<false>;
definieren Ein Beispiel für ein Hauptprogramm in main.cpp
könnte
Das kleine Projekt oben kompiliert einfach gut.
Frage: Wenn ich die expliziten Instanziierungen über der Definition des Verfahrens print
setzen (in a.cpp
), wird der Code nicht mehr kompilieren, mit den üblichen undefined reference to A<true>::print(...)
Fehlern.
#include "a.h"
template class A<true>;
template class A<false>;
template<bool b>
void A<b>::print(std::ostream& out) {
out << "A" << b;
}
Warum ist das der Fall?
bearbeiten: Makefile
main : main.o a.o
g++ main.o a.o -o main
main.o : main.cpp
g++ -c main.cpp
a.o : a.cpp
g++ -c a.cpp
funktioniert auch auf VS2012. – billz
Ich habe und ich änderte die Reihenfolge als Dejan erwähnt – billz
@jogojapan - +1. Ich habe meinen Kommentar gelöscht, der besagt, dass er mit clang32 und gcc48 kompiliert wird. Es wurde mit jedem Compiler und mit beliebiger Reihenfolge kompiliert, wenn der Inhalt von drei Dateien ausgeschnitten und in eine Datei eingefügt wurde - wie ich es ursprünglich für meinen Test getan hatte. Nachdem Dejan Makefile gepostet hatte, konnte ich Fehler mit clang und gcc jeder Version reproduzieren. –