Скажем, я объявляю класс шаблона A
в a.h
#include <iostream>
template<bool b>
class A {
public:
void print(std::ostream& out);
};
И определите метод печати в a.cpp
(с явным указанием для true
и 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>;
Примером основной основной программы в main.cpp
может быть
#include "a.h"
int main() {
A<true> a;
a.print(std::cout);
}
Небольшой проект выше компилируется просто отлично.
Вопрос: если я помещу явные экземпляры над определением метода print
(в a.cpp
), код больше не будет компилироваться с обычной ошибкой 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;
}
Почему это так?
Изменить: 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