다음 코드가 제대로 비주얼 스튜디오 2013와 함께 컴파일 :기본 이동 생성자가 unique_ptr에 사용 된 클래스의 default-deleter를 필요로하는 이유는 무엇입니까?
#include <memory>
namespace NS
{
class SomeOtherClass;
class MyClass
{
public:
MyClass();
virtual ~MyClass();
private:
std::unique_ptr<SomeOtherClass> m_someOtherClass;
};
}
int main()
{
auto mc = NS::MyClass();
}
이 때문에 main
에서 mc
의 초기화가 직접 이동 생성자 확인하지 않고 최적화 된 비주얼 스튜디오 2013의 버그입니다.
이동 생성자가 존재해야하기 때문에 비주얼 스튜디오 2015에서이 컴파일되지 않습니다, 그래서 우리는이에 코드를 변경합니다
#include <memory>
namespace NS
{
class SomeOtherClass;
class MyClass
{
public:
MyClass();
virtual ~MyClass();
MyClass(MyClass&&) = default;
private:
std::unique_ptr<SomeOtherClass> m_someOtherClass;
};
}
int main()
{
auto mc = NS::MyClass();
}
을 그리고 다시 컴파일.
하지만 이제 DLL을 내보내려는 경우 컴파일이 다시 실패합니다. 기본 생성 입주 생성자 SomeOtherClass
을 파괴 할 수있는 필요로
memory(1193): error C2027: use of undefined type 'NS::SomeOtherClass'
test.cpp(5): note: see declaration of 'NS::SomeOtherClass'
...
memory(1194): error C2338: can't delete an incomplete type
memory(1195): warning C4150: deletion of pointer to incomplete type 'NS::SomeOtherClass'; no destructor called
것 같다 :
#include <memory>
namespace NS
{
class SomeOtherClass;
class __declspec(dllexport) MyClass
{
public:
MyClass();
virtual ~MyClass();
MyClass(MyClass&&) = default;
private:
std::unique_ptr<SomeOtherClass> m_someOtherClass;
};
}
int main()
{
auto mc = NS::MyClass();
}
이 컴파일러 출력의 일부입니다 :이 수정 된 코드입니다. MyClass
에는 완전 정의가 SomeOtherClass
인 소멸자가 있기 때문에 이상합니다.
그럼 왜이 DLL을 내보낼 때 컴파일되지 않습니까? 기본 이동 생성자가 SomeOtherClass
의 정의를 알아야하는 이유는 무엇입니까?
왜 그런지는 말할 수 없습니다 (좋은 질문입니다). 당신은 당신이'MyClass :: MyClass (MyClass &&) = default; '를 여러분의 cpp 파일에 가지고 있고 헤더 파일에있는 선언 만 가지고있을 때 이것을 고칠 수있다. – Hayt
'main()'에'NS :: MyClass mc;'를 쓸 수 없습니까? – alain