我有一个C ++项目,其中包含几个类,每个类都在单独的文件中声明和定义。每个文件都一个一个地编译为.o文件,但是当我尝试链接它们以获取可执行文件时,一个类成员遇到未定义的引用错误。 我添加了一个伪造的代码,可以更清楚地表示这种情况:
//filea.hpp
#include "fileb.hpp"
class A;
typedef B<A> BA;
class A {
protected:
static BA *b;
public:
static void setBA(){b = new BA();}
};
/filea.cpp
#include "filea.hpp"
BA* A::b = nullptr; // will be initialized in main
//fileb.hpp
#include <vector>
template <class A>
class B {
std::vector<A*> v;
public:
void some_stuff(A*);
};
//fileb.cpp
#include "fileb.hpp"
template <class A>
void B<A>::some_stuff(A* a){
this->v.push_back(a);
}
//filec.hpp
#include "filea.hpp"
class C: public A {
public:
void foo();
};
//filec.cpp
#include "filec.hpp"
void C::foo () {
this->b->some_stuff((A*) this);
}
// main.cpp
#include "filec.hpp"
int main () {
A::setBA();
C c;
c.foo();
};
我的makefile是:
EXECUTABLE_NAME := execfile
CFLAGS := -std=c++14 -g -pthread
CC := g++
DEPS := fileb.hpp
%.o: %.c %.h $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
all: fileb.o filea.o filec.o
$(CC) fileb.o filea.o filec.o main.cpp -o $(EXECUTABLE_NAME) $(CFLAGS)
当我完成所有操作时,filea,fileb和filec成功编译。但是,在链接和编译到可执行阶段时,它会给出
g++ fileb.o filea.o filec.o main.cpp -o he2ExecFile -std=c++14 -g -pthread
filec.o: In function `C::foo()':
filec.cpp:(.text+0x1e): undefined reference to `B<A>::some_stuff(A*)'
collect2: error: ld returned 1 exit status
Makefile:11: recipe for target 'all' failed
make: *** [all] Error 1
在搜索过程中,发现未初始化静态成员会导致类似的错误,但它表示A :: b的未定义引用,这是完全不同的。
我看了相同的答案页,但没有解决我的问题。
问题出在模板上。我将实现文件放在.hpp文件中,并对其进行了编译。谢谢大家!