我为std::unique<B>
创建了一个小型测试用例,其类型为B
。
Test.h
#pragma once
#include <memory>
class B; //<--- compile error here
class Test{
std::unique_ptr<B> bPtr;
//#1 need to move destructor's implementation to .cpp
public: ~Test();
};
Test.cpp的
#include "Test.h"
class B{};
Test::~Test(){} //move here because it need complete type of B
的main.cpp
#include <iostream>
#include "Test.h"
using namespace std;
int main(){
Test test;
return 0;
}
我收到了这个错误: -
/ usr / include / c ++ / 4.8.2 / bits / unique_ptr.h:65:22:错误:无效 应用&#39; sizeof&#39;到不完整的类型&#39; B&#39;
据我了解,编译器告诉我B
是一个不完整的类型(在main.cpp
中),因此它无法正确删除B
。
但是,在我的设计中,我希望main.cpp
不具有完整类型的B
。
非常粗略地说,这是一个pimpl。
有一个好的解决方法吗?
以下是一些类似的问题,但没有一个提出干净的解决方法。
.cpp
(#1
)std::unique_ptr<B>
来显示一个丑陋的解决方法。然后,手动将封装器的析构函数移动到.cpp
。 (#2
)#3
) std::unique_ptr
不是正确的工具吗?
我应该创建自己的unique_ptr
吗?我可以使用#3
作为指南。
Kerrek SB 几乎解决了代码中的所有问题。非常感谢!
剩下的问题是: -
我应该创建自己的unique_ptr
来删除此限制吗?
可能吗? - 我想这是可能的,我现在正在尝试编码。