Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 导致vtable错误的Makefile设置_C++_Makefile - Fatal编程技术网

C++ 导致vtable错误的Makefile设置

C++ 导致vtable错误的Makefile设置,c++,makefile,C++,Makefile,我正在尝试制作一个简单的程序,其中我使用了模板和继承。 我正在使用LinuxGCC。然而,在EclipseCDT中,如果我只给出自己的makefile,我会得到一个关于vtable未定义引用的错误。另一方面,如果我选中buildiegenerate makefile automatically中的选项,错误就会消失。有人能指出可能的错误吗 下面是我的类,带有标题和makefile AbstractVehicleFactory.h: class AbstractVehicleFactory { p

我正在尝试制作一个简单的程序,其中我使用了模板和继承。 我正在使用LinuxGCC。然而,在EclipseCDT中,如果我只给出自己的makefile,我会得到一个关于vtable未定义引用的错误。另一方面,如果我选中buildiegenerate makefile automatically中的选项,错误就会消失。有人能指出可能的错误吗

下面是我的类,带有标题和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;
}
标准车辆.h:

#include "AbstractVehicleFactory.h"
template<typename T>
class StandardVehicle: public AbstractVehicleFactory {
public:
    StandardVehicle();
    virtual ~StandardVehicle();
protected :
    IVehicle* createVehicle();
private:
    T* mVehicle;
};
#包括“AbstractVehicleFactory.h”
模板
类别标准车辆:公共抽象车辆工厂{
公众:
标准车辆();
虚拟汽车(;
受保护的:
IVehicle*创建车辆();
私人:
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
模板
StandardVehicle::StandardVehicle(){
mVehicle=0;
}
模板
StandardVehicle::~StandardVehicle(){
}
模板
IVehicle*StandardVehicle::createVehicle(){
返回新的T();
}
生成文件:
#编译程序
CXX=g++
CXXFLAGS=-O2-g-Wall-fmessage长度=0
源=$(通配符*.cpp)
对象=$(源:.cpp=.o)
目标=Vehicle.exe
$(目标):$(对象)
$(CXX)-o$(目标)$(对象)$(库)$(LDFLAGS)
全部:$(来源)$(目标)
清洁:
rm-f$(对象)$(目标)
错误:
g++-o Vehicle.exe AbstractVehicleFactory.o Bus.o FactoryPattern.o IVehicle.o StandardVehicle.o
AbstractVehicleFactory.o:(.rodata.\u ZTV22AbstractVehicleFactory[vtable for AbstractVehicleFactory]+0x10):对“AbstractVehicleFactory::createVehicle()”的未定义引用
collect2:ld返回了1个退出状态
make:**[Vehicle.exe]错误1
有人能指出可能的错误吗

编辑:即使在检查makefile generate automatically之后,我也会在StandardVehicle构造函数上得到错误作为未定义的引用。StandardVehicle.o也未显示任何部件。它不是正常构建的吗?

您的代码说:

public:
StandardVehicle() ;
你不能这样做,因为这是一个模板。你必须把尸体放在那里

以后在另一个cpp文件中使用模板时,如下所示:

StandardVehicle<int>   myvar ;
标准车辆myvar;

编译器将立即生成
StandardVehicle
的所有代码,因此它不能引用StandardVehicle中的代码。cpp

您能在问题中找出哪些代码属于哪些编译单元/头文件吗?它只是一个包含所有这些文件的文件夹。除此之外,还有汽车班和公共汽车班。它们分别是接口和最终产品,工厂应根据定义的模板类返回最终产品。就像这个AbstractVehicleFactory*a=新标准车辆();i车辆*v=a->createVehicle();我一直要求您指出哪个代码位于哪个具体文件中,只需在示例代码(部分)前面加上s.th。比如
AbstractVehicleFactory.cpp:
。请编辑您的问题。哦,谢谢,但我必须将所有函数定义放在模板类的头文件中。有什么特别的原因吗?提前谢谢。