2017-01-11 3 views
0

Я пытаюсь реализовать вложенный класс C++ в одном точечном классе A.C++ вложенный класс неразрешенный внешний символ

это библиотека, и она прекрасно строится.

но когда я пытаюсь связать его с приложением, получите сообщение об ошибке связи.

любой совет очень оценен!

в основном, я хочу, чтобы сохранить доступ к B из-за пределов класса А.

a.lib (aa.obj): ошибка LNK2019: неразрешенный внешний символ «общественности: __thiscall A :: B :: B (аннулируются)»...

class A // singleton 
{ 

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

} 

EDIT: класс B имеет определение (B.cpp) и заголовок (Bh)

я пытаюсь скрыть Bh A nd введите B вложенный класс.

если я включать "B.h" это компилировать и ссылку отлично, но затем класс открыт B наружу ..

EDIT: решена! благодаря molbdnilo

Вы определили класс B внутри A? То есть класс 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 
{ 
//... 
}; 

EDIT: нашел еще одно простое решение, просто исключен класс B в классе А. я не подвергать что-либо из класса В.

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

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

Жалоба на то, что вы объявили конструктор для класса B, но на самом деле не реализовали его. Вы должны показать больше кода (т. Е. Полного минимального, жизнеспособного, примера). – selbie

+0

@selbie я отредактировал мой вопрос. – sailfish009

+1

Вы * определили * класс 'B' внутри' A'? То есть 'class A :: B {...};' и 'void A :: B :: foo (Bar baz) {...}'. – molbdnilo

ответ

0

Если вы хотите сохранить класс B частный; Я предлагаю переслать объявление в заголовке.

В CPP вы можете написать следующее:

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

Если вы делаете это таким образом; вам также может потребоваться переместить реализацию Ctor, Dtor, Copy/Move Ctor и Copy/Move в cpp и/или удалить их.

Смежные вопросы