C++ 模板类继承链接器错误

C++ 模板类继承链接器错误,c++,templates,inheritance,c++11,linker-errors,C++,Templates,Inheritance,C++11,Linker Errors,假设我有一个类模板a,而非模板类B继承自a。当A编译正常时,编译B会触发链接器错误。具体来说, A.hpp B.cpp 编译testB.cpp似乎还可以,但链接器不是一个快乐的露营者: 尝试1 尝试2 非常感谢您的任何帮助/想法。ld先生让我彻夜未眠,威胁着我的理智 编辑 谢谢你,迈克·西摩!这个最小的示例并不是真实代码的真实版本,因为在实现中确实缺少了一个限定符,这是关键所在。我建议您在两个不同的过程中编译和链接: g++ -c -std=c++11 -o B.o B.cpp g++ -c -

假设我有一个类模板
a
,而非模板类
B
继承自
a
。当
A
编译正常时,编译
B
会触发链接器错误。具体来说,

A.hpp B.cpp 编译
testB.cpp
似乎还可以,但链接器不是一个快乐的露营者:

尝试1 尝试2 非常感谢您的任何帮助/想法。
ld
先生让我彻夜未眠,威胁着我的理智

编辑
谢谢你,迈克·西摩!这个最小的示例并不是真实代码的真实版本,因为在实现中确实缺少了一个限定符,这是关键所在。

我建议您在两个不同的过程中编译和链接:

g++ -c -std=c++11 -o B.o B.cpp
g++ -c -std=c++11 -o TestB.o TestB.cpp
g++ -o test.exe B.o TestB.o

如果我的建议中断了,那么至少可以清楚地知道在哪里缺少了什么,并且您可以使用
nm

调试单个对象文件。我建议您在两个不同的过程中编译和链接:

g++ -c -std=c++11 -o B.o B.cpp
g++ -c -std=c++11 -o TestB.o TestB.cpp
g++ -o test.exe B.o TestB.o
  $ g++ -std=c++11 testB.cpp   
  Undefined references to B(), and ~B()
如果我的建议中断了,那么至少可以清楚地知道在哪里缺少了什么,并且您可以使用
nm
调试单个对象文件

  $ g++ -std=c++11 testB.cpp   
  Undefined references to B(), and ~B()
这显然是错误的(我这么说是因为我不明白你为什么要这样做)。 您只编译一个翻译单元,该单元使用未编译的另一个(B.cpp)中定义的符号

我认为您应该在testB.cpp中发布
后面的实际内容,以帮助发现问题。它可能在您使用的
foo()

预期:由于
foo
是类的静态成员方法,因此测试中的调用应该如下所示:

B::foo();
这显然是错误的(我这么说是因为我不明白你为什么要这样做)。 您只编译一个翻译单元,该单元使用未编译的另一个(B.cpp)中定义的符号

我认为您应该在testB.cpp中发布
后面的实际内容,以帮助发现问题。它可能在您使用的
foo()

预期:由于
foo
是类的静态成员方法,因此测试中的调用应该如下所示:

B::foo();

在实际代码中,
ParsedData::parsedStream
是一个模板,因此应该在头中定义,以便在可能需要实例化它的每个翻译单元中都可以使用它


而且,即使在
.cpp
文件中也没有定义它,因为您取消了
ParsedData::
限定符,而是在命名空间范围声明了一个不同的模板。

在实际代码中,
ParsedData::parsedStream
是一个模板,所以应该在头中定义,以便在每个可能需要实例化它的翻译单元中都可以使用它


另外,您甚至在
.cpp
文件中也没有定义它,因为您取消了
ParsedData::
限定符,而是在命名空间范围中声明了一个不同的模板。

除了点(不是双关语),我看不出您的代码有任何错误。第二次尝试显示了
对B.foo()的未定义引用。
,这意味着您没有实现
foo
静态函数第一次尝试将不起作用,因为它没有链接到定义
B
的成员函数的文件。第二种方法对我有效,只要我修复了发布代码中的所有编译错误。也许您可以发布一些示例代码,这些代码可以编译并再现错误。另外,这就是确切的错误消息吗?如果我删除了
foo
的定义,那么我的GCC版本会说“对`B::foo()'的未定义引用”@几乎可以肯定:如果您至少发布了包含
foo
调用的行,那就太好了。除了点(不是双关语),我看不出您的代码有任何错误。第二次尝试显示了
对B.foo()的未定义引用,这意味着您没有实现
foo
静态函数第一次尝试将不起作用,因为它没有链接到定义
B
的成员函数的文件。第二种方法对我有效,只要我修复了发布代码中的所有编译错误。也许您可以发布一些示例代码,这些代码可以编译并再现错误。另外,这就是确切的错误消息吗?如果我删除了
foo
的定义,那么我的GCC版本会说“对`B::foo()'的未定义引用”@almost肯定:如果您至少发布了包含
foo
调用的行,那就太好了。谢谢!!我花了好几个小时调试,这一疏忽让我退缩了!非常感谢。我花了好几个小时调试,这一疏忽让我退缩了!
$ g++ -std=c++11 testB.cpp   
Undefined references to B(), and ~B()
collect2: error: ld returned 1 exit status
$ g++ -std=c++11 testB.cpp B.cpp
Undefined reference to B.foo()
collect2: error: ld returned 1 exit status
g++ -c -std=c++11 -o B.o B.cpp
g++ -c -std=c++11 -o TestB.o TestB.cpp
g++ -o test.exe B.o TestB.o
  $ g++ -std=c++11 testB.cpp   
  Undefined references to B(), and ~B()
B::foo();