我有一个无法移动或复制的类型(通过将必要的构造函数和运算符设为私有)。但是当我尝试编译它们的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试图访问它们,它也是一个未解析的外部,因为它们只被声明为私有。没有意义:(
答案 0 :(得分:9)
从C ++ 03开始,元素必须是可复制的,并且可以复制。 §23.1/ 3:
存储在这些组件中的对象类型必须满足CopyConstructible类型(20.1.3)的要求,以及可分配类型的附加要求。
在C ++ 0x中,需求是基于每个操作的,但一般来说,可以安全地说元素必须是可构造的并且可移动可分配。 (虽然有些操作需要复制可构造性和赋值能力等)
您问题的典型解决方案是通过shared_ptr
或其他智能指针存储指向对象的指针。
答案 1 :(得分:0)
标准容器需要其元素类型是可复制的,如果您有不可复制的类型,请使用(智能)指针作为元素类型(例如:std::list<boost::shared_ptr<YourType> >
。
模板类/函数通常会生成错误,除非您明确使用它们,因此可能是您没有出错。