对类I成员的未定义引用,该成员在另一个类中用作静态成员(已解决)

时间:2019-04-25 12:37:16

标签: c++ inheritance static-members multiple-files

我有一个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文件中,并对其进行了编译。谢谢大家!

0 个答案:

没有答案