dire che mi dichiaro una classe template A
in a.h
Perché posizione esplicita modello di istanza importa
#include <iostream>
template<bool b>
class A {
public:
void print(std::ostream& out);
};
e definire il metodo di stampa a a.cpp
(con instatiation esplicita true
e 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>;
Un esempio di programma principale principale in main.cpp
potrebbe essere
#include "a.h"
int main() {
A<true> a;
a.print(std::cout);
}
Il piccolo progetto sopra compila bene.
Domanda: Se metto le istanze esplicite di sopra della definizione del metodo print
(in a.cpp
), il codice non viene compilato più, con il solito errore di undefined reference to A<true>::print(...)
.
#include "a.h"
template class A<true>;
template class A<false>;
template<bool b>
void A<b>::print(std::ostream& out) {
out << "A" << b;
}
Perché è questo il caso?
Edit: Makefile per compilare
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
funziona anche su VS2012. – billz
Ho fatto e ho cambiato l'ordine come Dejan menzionato – billz
@jogojapan - +1. Ho cancellato il mio commento che diceva che si compila con clang32 e gcc48. Si stava compilando bene con qualsiasi compilatore e con qualsiasi ordine se i contenuti di tre file sono stati tagliati e incollati in un unico file - come ho fatto inizialmente per il mio test. Dopo che Dejan ha pubblicato Makefile, sono riuscito a riprodurre l'errore con clang e gcc di qualsiasi versione. –