【发布时间】:2019-03-09 10:07:08
【问题描述】:
考虑以下简单代码:
#include <memory>
template<typename T>
struct Foo
{
virtual T & foo() = 0;
};
struct Bar : public Foo<int>
{
int x;
virtual int & foo() override
{
return x;
}
};
void baz(std::unique_ptr<Foo<int>>)
{
}
int main()
{
auto up = std::make_unique<Bar>();
baz(up);
return 0;
}
它不会编译报告这个错误:
prog.cc:27:9: error: could not convert 'up' from 'unique_ptr<Bar,default_delete<Bar>>' to 'unique_ptr<Foo<int>,default_delete<Foo<int>>>'
27 | baz(up);
| ^~
| |
| unique_ptr<Bar,default_delete<Bar>>
我想知道如何解决这个问题。 share_ptr 似乎有适当的转换方法来解决这个问题,而对于unique_ptr 似乎没有其他选择。
【问题讨论】:
-
Foo需要一个virtual析构函数 -
您的代码无法按原样工作,因为无法复制
std::unique_ptr。鄙视,你为什么需要在这里传递std::unique_ptr?使用没有所有权的原始指针并不是一件坏事。
标签: c++ templates unique-ptr