具有菱形结构的未解析外部符号

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 应该只添加一个新方法 b1A1_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 您还有其他问题吗?

以上是关于具有菱形结构的未解析外部符号的主要内容,如果未能解决你的问题,请参考以下文章

函数中引用的未解析的外部符号 _wcstok

IAudioClient::Initialize 方法的未解析外部符号。 WASAPI API

C++:错误 LNK2019:函数 _main 中引用的未解析的外部符号

函数_main(OPENGL C++)中引用的未解析的外部符号_____________

LNK2019:函数“void __cdecl mainfunc(void)”中引用的未解析外部符号 _kiss_fftr_alloc

LNK2019:未解析的外部符号 _main 在函数 ___tmainCRTStartup 中引用