2013-11-24 3 views
0

Я пытаюсь создать простую программу, в которой я использую наследование 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 не отображает никаких компонентов. Разве это не правильно?

+0

Не могли бы вы разобраться в своем вопросе, какой код принадлежит к каким единицам компиляции/файлам заголовков? –

+0

Его единственная папка, содержащая все эти файлы. Помимо этих классов IVehicle и Bus есть. Они представляют собой только интерфейс и конечный продукт соответственно, и фабрика должна вернуть конечный продукт на основе определенного класса шаблона. Подобно этому AbstractVehicleFactory * a = new StandardVehicle (); IVehicle * v = a-> createVehicle(); –

+0

Я просил вас указать, какой код является местом, в котором конкретный файл, просто предшествуйте вашему образцу кода (частей) с помощью s.th. как 'AbstractVehicleFactory.cpp:'. Измените свой вопрос, пожалуйста. –

ответ

1

Ваш код говорит:

public: 
StandardVehicle() ; 

Вы не можете сделать это, потому что его шаблон. Вы должны иметь тело там в .h

При последующем использовании шаблона в другом файле CPP, как это:

StandardVehicle<int> myvar ; 

компилятор собирается сделать весь код для StandardVehicle<int> прямо на месте , поэтому он не может ссылаться на код в StandardVehicle.cpp

+0

oh спасибо, но мне пришлось поместить все определения функций в заголовочный файл для класса шаблона. Какая-то конкретная причина для этого? Заранее спасибо. –

Смежные вопросы