Это совершенно загадочно для меня. Я использую g ++ в Ubuntu, и это часть моего кода (с изменением имен классов, но больше ничего, потому что я все еще использую заглушки везде):
Bob.hpp
template <class A>
class Bob : public Jack<Chris, A>
{
public:
Bob(int x1, int x2, float x3 = 1.0, float x4 = 2.0, float x5 = 3.0) throw(Exception);
virtual ~Bob();
};
Я реализовал в другом файле, как это:
Bob.cpp
template <class A>
Bob<A>::Bob(int x1, int x2, float x3, float x4, float x5) throw(Exception)
{
}
template <class A>
Bob<A>::~Bob()
{
}
и я использовал это так:
main.cpp
int main()
{
Bob<Alice> instance(1, 2);
}
Компиляция с:
g++ -c Bob.cpp -o Bob.o
g++ -c main.cpp -o main.o
g++ -L"libs" -llib main.o Bob.o prog
дает мне
main.o: В функции main':
main.cpp:(.text+0x1fd): undefined reference to
Bob :: Bob (int, int, float, float, float) '
collect2: ld вернул 1 статус выхода
Я полностью в тупике. Изменение порядка на этапе связывания g ++ не имеет значения. Компиляция объектных файлов не создает проблем. И почему неопределенная ссылка, когда я реализовал конструктор? Если кто-то может пролить свет на это, это будет высоко ценится.