我有一个无法移动或复制的类型(通过将必要的构造函数和运算符设为私有(private))。但是当我试图编译它们的 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'
当然,链表中的类型不一定是可移动或可复制的。
当这些成员被公开时,代码编译得很好——即使,如果 std::list 试图访问它们,它将是一个未解析的外部,因为它们只被声明为私有(private)的。没有意义:(
最佳答案
从 C++03 开始,元素必须是可复制构造和可复制赋值的。 §23.1/3:
The type of objects stored in these components must meet the requirements of CopyConstructible types (20.1.3), and the additional requirements of Assignable types.
在 C++0x 中,要求以每个操作为基础,但通常可以肯定地说元素必须是可移动构造和可移动赋值的。 (虽然有些操作需要复制可构造性和可分配性等)
您的问题的典型解决方案是通过 shared_ptr
或其他一些智能指针存储指向对象的指针。
关于c++ - std::list 的类型要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3077135/