具有菱形结构的未解析外部符号
Posted
技术标签:
【中文标题】具有菱形结构的未解析外部符号【英文标题】:unresolved external symbol with diamond structure 【发布时间】:2014-03-01 23:55:03 【问题描述】:以下代码运行良好:
#include "stdafx.h"
class A1
public:
virtual void a1() = 0;
;
class B1 : virtual public A1
public:
virtual void b1()
A1::a1();
;
class A1_Impl : virtual public A1
public:
virtual void a1()
;
class B_Combined : virtual public A1_Impl/*, virtual public B1*/
;
int _tmain(int argc, _TCHAR* argv[])
B_Combined b;
return 0;
删除/*
和*/
后,编译器会显示"'B_Combined': inherits 'A1_Impl::A1_Impl::a1' via dominance"
警告。我想没关系,因为我希望 B_Combined 继承 A1_Impl
中的 A1::a1
的实现(它是唯一的实现)。
但我也收到一条错误消息:
error LNK2001: unresolved external symbol ""public: virtual void __thiscall A1::a1(void)" (?a1@A1@@UAEXXZ)".
我对此有点困惑。为什么 A1_Impl 中的实现不起作用?从 B1 派生 B_Combined 应该只添加一个新方法 b1
在 A1_Impl
中调用 A1::a1
的实现。
【问题讨论】:
对我来说很好用:ideone.com/817Pli @user3369521 请出示你的真实代码,这样编译正常 【参考方案1】:您发布的代码编译良好。但是,您提到的链接错误将由声明引起
class B_Combined : virtual public A1_Impl, virtual public B1
;
因为你确实在virtual void B1::b1
中调用A1::a1();
,但A1::a1
是纯抽象的。除非您为其提供正文,否则不得致电 A1::a1
。
【讨论】:
是的,你是对的,你必须删除评论才能看到问题。但我仍然不明白为什么存在未解析的符号。正如你所说,我调用 A1::a1(),它没有在 B1 中实现,但在 A1_Impl 中实现,这不算吗? 不,B1 abd A1_impl 类不共享实现。它们都是从 A1 派生的,如果要使用它,它们都必须实现虚拟 a1。此外,您永远不能直接调用 A1::a1(),因为这是静态调用,函数没有主体 @user3369521 您还有其他问题吗?以上是关于具有菱形结构的未解析外部符号的主要内容,如果未能解决你的问题,请参考以下文章
IAudioClient::Initialize 方法的未解析外部符号。 WASAPI API
C++:错误 LNK2019:函数 _main 中引用的未解析的外部符号
函数_main(OPENGL C++)中引用的未解析的外部符号_____________
LNK2019:函数“void __cdecl mainfunc(void)”中引用的未解析外部符号 _kiss_fftr_alloc