在 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
,因此不存在从 B
到 A
的可用转换。更改为 public
继承,您的代码将编译。
template <typename T>
class B: public A<T>{};
// ^^^^^^
在您的示例中,A
的析构函数应该是 virtual
,否则当 foo
超出范围时您将拥有 undefined behavior,因为您将试图通过 A *
.
delete
一个 B
实例
我在尝试对派生自其他类型的模板化类型使用 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
,因此不存在从 B
到 A
的可用转换。更改为 public
继承,您的代码将编译。
template <typename T>
class B: public A<T>{};
// ^^^^^^
在您的示例中,A
的析构函数应该是 virtual
,否则当 foo
超出范围时您将拥有 undefined behavior,因为您将试图通过 A *
.
delete
一个 B
实例