У меня есть два разных шаблонных класса, один из которых использует в качестве параметра объект другого шаблонного класса. я получаю сообщение об ошибке:
collect2: ld вернул 1 статус выхода
make: * [main] Ошибка 1
Я работаю с явным созданием экземпляров шаблонов, и я нашел несколько связанных постов, но они в основном были связаны с созданием одного единственного класса шаблонов. В моем случае у меня есть 3 файла на класс (.h, .cpp, .inc после http://www.parashift.com/c++-faq/templates.html#faq-35.13 предложения).
foo.h
#ifndef FOO_H
#define FOO_H
template < class S >
class Foo{
public: ...
private: ...
};
#endif
foo.cpp
...
template < class S >
Foo<S>::Foo(){ .... }
...
#include "foo.inc"
foo.inc
template class Foo<int>;
template class Foo<float>;
bar.h
#ifndef BAR_H
#define BAR_H
#include <mylib.h>
template < class T >
class Bar{
public: ...
template <class S>
void doSomething(Foo<S>*);
private: ...
};
#endif
bar.cpp
....
template <class T> template <class S>
void Bar<T>::doSomething(Foo<S>*p){
....
}
.....
#include "bar.inc"
bar.inc
template class Bar<int>;
template class Bar<float>;
template void Bar<int>::doSomething(Foo<int>*);
template void Bar<float>::doSomething(Foo<float>*);
mylib.h
#include <foo.h>
#include <bar.h>
main.cpp
#include <mylib.h>
#include <common.h>
int main(){
Foo<float> * pFoo = NULL;
pFoo = new Foo<float>();
Bar<float> * pBar = NULL;
pBar = new Bar<float>();
pBar->doSomething(pFoo);
delete pFoo;
delete pBar;
return (0);
}
Кто-нибудь видит какие-либо проблемы / ошибки в том, как я создаю объекты? Полное сообщение об ошибке (я изменил название классов и упростил код, чтобы сделать его более понятным):
g++ -O3 -Wall main.cpp -o ../bin/main -I../inc -L../lib -lmylib -lm
/tmp/cciJHsKr.o: In function `main':
main.cpp:(.text+0x19f): undefined reference to `void Bar<float>::doSomething<float>(Foo<float>*)'
collect2: ld returned 1 exit status
make: *** [main] Error 1
Обратите внимание, что я компилирую и foo.cpp, и bar.cpp отдельно, так как я генерирую библиотеку.
// Makefile for foo.cpp & bar.cpp
INC=./inc
SRC=./src
LIB=./lib
OBJ=./obj
CC=g++
CFLAGS=-O3 -Wall
mylib: $(LIB)/mylib.a
echo "mylib was created!..."
$(LIB)/mylib.a: \
$(OBJ)/bar.o \
$(OBJ)/foo.o
ar csr $(LIB)/mylib.a \
$(OBJ)/bar.o \
$(OBJ)/foo.o \
$(OBJ)/bar.o: $(SRC)/bar.cpp
$(CC) -c $(CFLAGS) $(SRC)/bar.cpp -I$(INC) \
-o $(OBJ)/bar.o