c++ - 将 unique_ptr<Derived<T>> 传递给函数

标签 c++ c++17 move smart-pointers

我需要将一个指向派生模板类的唯一指针传递给采用唯一基模板类的函数,如下所示:

template <typename T>
class Base {};

template <typename T>
class Derived : public Base<T> {};

template <typename T>
void foo(std::unique_ptr<Base<T>>){}

//or

template <typename T>
class MyClass{
public:
    MyClass(std::unique_ptr<Base<T>> arg) : _arg(std::move(arg)) {}
private:
    std::unique_ptr<Base<T>> _arg;
};

int main()
{
    auto b = make_unique<Derived<int>>();
    foo(std::move(b));
    MyClass mc(std::move(b))
}

为什么这不起作用以及如何修复它?

我收到错误:

'void foo1<T>(std::unique_ptr<Base<T>,std::default_delete<Base<T>>>)': cannot convert argument 1 from 'std::unique_ptr<Derived<int>,std::default_delete<Derived<int>>>' to 'std::unique_ptr<Base<T>,std::default_delete<Base<T>>>'

但它有效

auto derived = std::make_unique<Derived<int>>();
std::unique_ptr<Base<int>> base = std::move(derived);

最佳答案

在这种情况下,C++ 不会推断出模板参数。您可以指定<int> ,那就会成功。

foo<int>(std::move(b)); // fine
MyClass<int> mc(std::move(b)); // fine

See it on coliru

关于c++ - 将 unique_ptr<Derived<T>> 传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74457840/

相关文章:

c++ - 类的 begin() 方法编译错误

c++ - 重载继承的构造函数

c++ - 有没有办法部分匹配可变参数模板参数包?

c++11返回值优化还是搬家?

c++ - 这些构造函数是否正确?

linux - Bash根据列表将多个子目录(包括文件) move 到目标目录

c++ - 具有专门构造函数的模板类

c++ - JNI 与 C++ 对象实例

c++ - 声明后在数组中分配多个值

c++ - 如何在不获取未定义行为的情况下重新解释或转换具有已知内存布局的对象