输入std :: list的要求

时间:2010-06-19 20:32:48

标签: 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'

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

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

2 个答案:

答案 0 :(得分:9)

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

  

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

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

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

答案 1 :(得分:0)

标准容器需要其元素类型是可复制的,如果您有不可复制的类型,请使用(智能)指针作为元素类型(例如:std::list<boost::shared_ptr<YourType> >

模板类/函数通常会生成错误,除非您明确使用它们,因此可能是您没有出错。