c++嵌套类未解析的外部符号

c++ nested class unresolved external symbol

本文关键字:外部 符号 嵌套 c++      更新时间:2023-10-16

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

这是图书馆,建得很好。

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

非常感谢任何提示!

基本上,我想从A类之外保留访问B。

a.lib(aa.obj):错误LNK2019:未解析的外部符号"public:__此调用A::B::B(无效)"…

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{…};和void A::B::foo(Bar-baz){…}。–molbdnilo

Edit:这是应用的源代码。

// 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的私有性;我建议在标题中提前声明。

在cpp中,您可以编写以下内容:

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

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