2010-06-19 60 views
3

我有一个无法移动或复制的类型(通过使必要的构造函数和运算符变为私有)。但是,当我试图编译它们的std :: list时,操作失败,出现了一个非常奇怪的错误(为简洁起见,缩减了类名称)。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。是没有意义的:(

+3

“当然,它不是一个链接列表中的类型是任意可移动或可复制的。”那么它应该如何从列表外部获得值到内部该列表?:) – GManNickG 2010-06-19 20:53:29

+0

通过使用调整大小和默认构建它们。为什么没有明确的功能来添加默认构建的函数,我不知道。 – Puppy 2010-06-19 20:54:58

+2

因为,由于容器需求明确指出对象必须是可复制构建的,所以没有太多理由去打扰它。 – 2010-06-19 22:12:46

回答

9

作为C++ 03,元件必须拷贝构造和拷贝分配§23.1/ 3:

的类型存储在这些部件的对象必须满足复制构造的要求类型(20.1.3),以及可分配类型的附加要求。

在C++ 0x中,要求换上了每个操作,但总的来说它可以安全地说元素必须被移动constructible和可移动(尽管有些操作需要复制可构建性和赋值能力等)

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

+0

但是,如果代码公开,代码不会生成错误。如果它们必须是可复制的,它们应该如此,因为它们只被声明。 – Puppy 2010-06-19 20:46:13

+5

@DeadMG,这是因为编译器正在删除副本,因此不需要定义函数。它仍然必须可以访问。 – avakar 2010-06-19 20:49:32

+0

解释它。可惜我不能将评论标记为答案。 – Puppy 2010-06-19 22:56:14

0

标准集装箱需要他们的元素的类型为可复制,如果你有不可复制的类型,使用(智能)指针作为元素类型,而不是(如:std::list<boost::shared_ptr<YourType> >,除非你使用它们

模板类/功能往往产生错误明确地说,所以它可能是你没有得到一个错误