c++ - std::list 的类型要求

标签 c++

我有一个无法移动或复制的类型(通过将必要的构造函数和运算符设为私有(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/

相关文章:

c++ - Visual Studio 2010 全局 VC++ 目录 Redux

c++ - 调用 std::vector<Class type> 的析构函数使 for_each 无效

c++ - 从 CreateProcess() 执行时,diskpart 无法正确处理脚本

c++ - 如何在 boost.python 中转换 std::string* ?

c++ - Windows 已触发断点

c++ - 如何解决不支持 3 个参数的变体 apply_visitor?

c++ - void* (*)() 和 void* 有什么区别?

c++ - OSX 运行时动态库路径搜索

c++ - 如何在模板实例化中强制将 char[] 转换为 char*?

c++ - setsockopt 失败并返回 -1