在 C++1y 中从模板化基础派生的类型上使用 std::move on unique_ptr

using std::move on unique_ptr on a type derived from templated base in C++1y

我在尝试对派生自其他类型的模板化类型使用 std::move 语义时遇到问题。那就是我在以下示例中遇到错误。

#include <memory>

template <typename T>
class A{
};

template <typename T>
class B:A<T>{
};

int main()
{
  std::unique_ptr<B<int> > bar(new  B<int>());    
  std::unique_ptr<A<int> > foo (std::move(bar));
}

错误在定义 foo 的行上,它是:

In function 'int main()':
17:47: error: no matching function for call to 'std::unique_ptr<A<int> >::unique_ptr(std::remove_reference<std::unique_ptr<B<int> >&>::type)'

显然,非模板等效项工作正常。

问题是我使用的是私有继承。 当我将 B 的定义更改为: class乙:public 一切正常。

我保留这个其他解决方案只是为了记录: 由于缺乏更好的主意,我将求助于此:

std::unique_ptr<A<int> > foo ( (A<int> * ) new  B<int>());

B 私下继承自 A,因此不存在从 BA 的可用转换。更改为 public 继承,您的代码将编译。

template <typename T>
class B: public A<T>{};
//       ^^^^^^

在您的示例中,A 的析构函数应该是 virtual,否则当 foo 超出范围时您将拥有 undefined behavior,因为您将试图通过 A *.

delete 一个 B 实例