Я пытаюсь скомпилировать минимальный пример, который создает
шаблон класса. Пример компилируется нормально при определенном порядке
деклараций сохраняется, но в противном случае происходит сбой.
temp.h:
#include <iostream>
template <bool display>
class test {
public:
void sayHi();
};
temp.cpp:
#include "temp.h"
template <bool display>
void test<display>::sayHi () {
if (display) std::cout << "Hi";
}
main.cpp:
#include <iostream>
#include "temp.h"
int main () {
test<true> myobject;
myobject.sayHi();
return 0;
}
Это стандарт того, как включать классы.
В GCC 4.4.6 это завершается с ошибкой
main.cpp :(. text + 0x3a): неопределенная ссылка на `test :: sayHi () '
Однако, пример компилируется, когда я делаю #include "temp.cpp" вместо #include "temp.h" в main.cpp
файл, так что компилятор сначала читает объявление класса в temp.h, затем
видит содержимое файла temp.cpp и только потом содержимое файла main.cpp.
Когда я использую не шаблонные классы, все работает нормально, включая только файлы .h
в main.cpp - что здесь не так? Обратите внимание, что temp.cpp включен
в моем Makefile, так что он определенно не должен быть забыт компилятором.
Спасибо за любую помощь.