【问题标题】:c++ nested class unresolved external symbolc++嵌套类未解析的外部符号
【发布时间】:2017-05-26 04:28:43
【问题描述】:

我试图在单例类 A 中实现嵌套的 c++ 类 B。

这是一个库,它构建得很好。

但是当我尝试将它与应用程序链接时,得到链接错误消息。

非常感谢任何提示!

基本上,我想保持从 A 类外部访问 B。

a.lib(aa.obj):错误 LNK2019:未解析的外部符号“公共: __thiscall A::B::B(void)" ...

class A // singleton 
{

//...
private:
 class B{//...}; 
 std::vector<std::unique_ptr<B>> var;

}

编辑: B类有定义(B.cpp)和标题(B.h)

我正在尝试隐藏 B.h 并使 B 嵌套类。

如果我包含“B.h”,它编译和链接很好,但是然后将 B 类打开到外部..

编辑: 解决了!感谢 molbdnilo

您是否在 A 中定义了 B 类?即,类 A::B { ... };和 无效 A::B::foo(Bar baz) { ... }。 – molbdnilo

编辑:这是应用的源代码。

// A.h
class A // singleton 
{
//...
private:
 class B; 
 static std::vector<std::unique_ptr<B>> var;
}

// A.cpp
#include "B.h"
std::vector<std::unique_ptr<A::B>> A::var;

// B.h
#include "A.h"
class A::B
{
//...
};

编辑:找到了另一个简单的解决方案,只是在 A 类中排除了 B 类。我不必暴露 B 类的任何内容。

// private.h
extern std::vector<std::unique_ptr<B>> var;

//A.cpp
std::vector<std::unique_ptr<B>> var;

【问题讨论】:

  • 抱怨你为 B 类声明了一个构造函数,但实际上并没有实现它。您应该显示更多代码(即完整的最低限度、可行的示例)。
  • @selbie 我编辑了我的问题。
  • 您是否定义 B 类在A 中?即class A::B { ... };void A::B::foo(Bar baz) { ... }

标签: c++


【解决方案1】:

如果您想将 B 类保密;我建议在标题中提前声明它。

在cpp中你可以写如下:

class A::B final {
    // All code for B
};

如果你这样做;您可能还想将 Ctor、Dtor、Copy/Move Ctor 和 Copy/Move 分配的实现移动到 cpp 和/或删除它们。

【讨论】:

    猜你喜欢
    • 2013-02-17
    • 2013-02-28
    • 2012-11-19
    • 1970-01-01
    • 2013-05-25
    • 2021-05-31
    • 2012-12-17
    • 2012-06-30
    相关资源
    最近更新 更多