Я пытаюсь создать простую программу, в которой я использую наследование n шаблонов. Я использую Linux gcc. Тем не менее, в eclipse cdt, если я просто даю свой собственный makefile, я получаю сообщение об ошибке vtable undefined reference. С другой стороны, если я проверю опцию в сборке, т.е. автоматически создаст makefile, ошибка исчезнет. Может кто-нибудь указать, что может быть неправильным?Параметры Makefile, приводящие к ошибке vtable
вот мои классы с заголовками и Makefile
AbstractVehicleFactory.h:
class AbstractVehicleFactory {
public:
AbstractVehicleFactory() {}
virtual ~AbstractVehicleFactory() {}
IVehicle* getVehicle();
virtual IVehicle* createVehicle() = 0;
private:
IVehicle* mVehicle;
};
AbstractVehicleFactory.cpp
IVehicle* AbstractVehicleFactory::getVehicle() {
if(!mVehicle) {
mVehicle = createVehicle();
}
return mVehicle;
}
StandardVehicle.h:
#include "AbstractVehicleFactory.h"
template<typename T>
class StandardVehicle: public AbstractVehicleFactory {
public:
StandardVehicle();
virtual ~StandardVehicle();
protected :
IVehicle* createVehicle();
private:
T* mVehicle;
};
StandardVehicle.cpp:
template<typename T>
StandardVehicle<T>::StandardVehicle() {
mVehicle = 0;
}
template<typename T>
StandardVehicle<T>::~StandardVehicle() {
}
template<typename T>
IVehicle* StandardVehicle<T>::createVehicle() {
return new T();
}
Makefile:
# compiler
CXX = g++
CXXFLAGS = -O2 -g -Wall -fmessage-length=0
SOURCES= $(wildcard *.cpp)
OBJECTS= $(SOURCES:.cpp=.o)
TARGET= Vehicle.exe
$(TARGET): $(OBJECTS)
$(CXX) -o $(TARGET) $(OBJECTS) $(LIBS) $(LDFLAGS)
all: $(SOURCES) $(TARGET)
clean:
rm -f $(OBJECTS) $(TARGET)
Error:
g++ -o Vehicle.exe AbstractVehicleFactory.o Bus.o FactoryPattern.o IVehicle.o StandardVehicle.o
AbstractVehicleFactory.o:(.rodata._ZTV22AbstractVehicleFactory[vtable for AbstractVehicleFactory]+0x10): undefined reference to `AbstractVehicleFactory::createVehicle()'
collect2: ld returned 1 exit status
make: *** [Vehicle.exe] Error 1
Может кто-нибудь указать, что может быть неправильным?
Редактировать: Даже после проверки makefile генерировать автоматически, я получаю ошибку в конструкторе StandardVehicle как неопределенная ссылка. StandardVehicle.o не отображает никаких компонентов. Разве это не правильно?
Не могли бы вы разобраться в своем вопросе, какой код принадлежит к каким единицам компиляции/файлам заголовков? –
Его единственная папка, содержащая все эти файлы. Помимо этих классов IVehicle и Bus есть. Они представляют собой только интерфейс и конечный продукт соответственно, и фабрика должна вернуть конечный продукт на основе определенного класса шаблона. Подобно этому AbstractVehicleFactory * a = new StandardVehicle(); IVehicle * v = a-> createVehicle(); –
Я просил вас указать, какой код является местом, в котором конкретный файл, просто предшествуйте вашему образцу кода (частей) с помощью s.th. как 'AbstractVehicleFactory.cpp:'. Измените свой вопрос, пожалуйста. –