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

时间:2017-01-11 11:37:12

标签: c++

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

这是库,它构建得很好。

但是当我尝试将其与应用程序链接时,请获取链接错误消息。

任何提示非常赞赏!

基本上,我想从A类外部继续访问B.

  

a.lib(aa.obj):错误LNK2019:未解析的外部符号“public:   __thiscall 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

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

// 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;

1 个答案:

答案 0 :(得分:0)

如果你想保持B级私密;我建议在标题中声明它。

在cpp中你可以写下以下内容:

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

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