c++ 按值传递模板化unique_ptr
c++ Passing templated unique_ptr by value
我有一个派生类,我想创建一个unique_ptr并将其传递给函数。 我可以按如下方式执行此操作:
#include <memory>
struct Base{};
struct Derived : public Base
{};
void foo(std::unique_ptr<Base> sink)
{
}
int main(){
foo(std::make_unique<Derived>());
return 0;
}
但是当我想对派生进行模板化时,它不再编译:
#include <memory>
struct Dummy
{};
template<class D>
struct Base{};
template<class D>
struct Derived : public Base<D>
{};
template<class D>
void foo(std::unique_ptr<Base<D>> sink)
{
}
int main(){
foo(std::make_unique<Derived<Dummy>>()); //does not compile
//foo(std::unique_ptr<Base<Dummy>>(new Derived<Dummy>())); // compiles
return 0;
}
我可以通过定义一个 Base 唯一 ptr 并使用派生的裸指针对其进行初始化来解决这个问题。
foo(std::unique_ptr<Base<Dummy>>(new Derived<Dummy>()));
然而,这似乎有点不对劲。
我错过了为什么不编译的原因吗?
还有我缺少其他方法如何使用模板化类并且不需要使用裸指针吗?
编译MCVE1 编译 MCVE2
在这种情况下,编译器只是无法推断类型。您可以通过传递以下类型来帮助它:
foo<Dummy>(std::make_unique<Derived<Dummy>>());
但是如果你这样声明foo
:
template <template<class, class> class X, class Y, class Z>
void foo(X<Y,Z> sink) {}
或者像这样:
template<class D, class S>
void foo(std::unique_ptr<D, S> sink){}
它适用于以下两种情况:
foo(std::make_unique<Derived<Dummy>>());
foo(std::unique_ptr<Base<Dummy>>(new Derived<Dummy>()));
相关文章:
- 为什么 std::unique 不调用 std::sort?
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 生成"unique"矩阵
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 我对 std::unique(算法)C++有问题
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- std::shared_ptr::unique(),复制和线程安全
- 如何在C++03中用自定义谓词调用std::unique
- C++中的指针否定 (!ptr == NULL)
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误