【发布时间】:2019-10-22 19:44:00
【问题描述】:
我需要使用VS2012编译器并且有:
virtual std::unique_ptr<MyType> pass_through(std::unique_ptr<MyType> instance) override { return std::unique_ptr<MyType>(nullptr); };
该定义仅作为存根存在于项目中,并且没有 MyType 析构函数,我收到以下错误:
错误 LNK2001:无法解析的外部符号“public: __thiscall MyType::~MyType(void)”(??1MyType@@QAE@XZ)
所以我创建了一个定义:
MyType::~MyType() {}
这就是问题所在,我不想让上面的函数通过构建而混淆定义。所以有没有办法不需要指定析构函数定义并且仍然具有该 pass_through 方法的有效实现?
也许我可以以某种方式更改方法的签名,或者它的逻辑在主要实现中基本相同,它执行以下操作:
std::unique_ptr<MyType> pass_through(std::unique_ptr<MyType> instance)
{
if (!instance) {
instance= std::unique_ptr<MyType>(new MyType(/*arguments*/));
}
instance->something();
return instance;
}
顺便说一句,我看到类似的问题被否决/关闭,但仍然在建议中我没有看到任何相关的答案,而且我之前也使用过谷歌,但仍然没有命中 => 可能以某种方式用好的答案推广相关问题,如果有的话有吗?
【问题讨论】:
-
你可以把它声明为默认值~MyType() = default
-
谢谢,我的意思是我根本不想有定义。但这是改进。 “~MyType() = delete;”怎么样?然后?当我不需要析构函数时会更好。
-
当你想拥有该类的实例时,你不能没有析构函数。它将如何被摧毁?
-
我个人认为没有你声明的析构函数的定义更令人困惑。如果删除析构函数,则永远无法创建该类的实例。
-
啊哈,我的声明没有问题,但是定义,在有问题的编译单元中,我不能使用“= default;”,因为声明是共享的,定义不是在其他编译单元中微不足道。
标签: c++ c++11 destructor definition interface-implementation