输入std :: list的要求

Pup*_*ppy 3 c++

我有一个无法移动或复制的类型(通过使必要的构造函数和运算符私有).但是当我尝试编译它们的std :: list时,操作失败并出现了一个非常奇怪的错误(为简洁起见,类名称被剪切).

1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xmemory(202)
: error C2248: 'T::T' : cannot access private member declared in class 'T'
Run Code Online (Sandbox Code Playgroud)

当然,链表中的类型不是可移动或可复制的.

当这些成员公开时,代码编译得很好 - 即使std :: list试图访问它们,它也是一个未解析的外部,因为它们只被声明为私有.没有意义 :(

GMa*_*ckG 9

从C++ 03开始,元素必须是可复制的,并且可以复制.§23.1/ 3:

存储在这些组件中的对象类型必须满足CopyConstructible类型(20.1.3)的要求,以及可分配类型的附加要求.

在C++ 0x中,需求是基于每个操作的,但一般来说,可以安全地说元素必须是可构造的并且可移动可分配.(虽然有些操作需要复制可构造性和赋值能力等)

您的问题的典型解决方案是存储指向对象,指针shared_ptr或其他智能指针的指针.

  • @DeadMG,这是因为编译器正在删除副本,因此不需要定义函数.它仍然必须是可访问的. (5认同)