我正在解析一个文件并创建一个Foo对象向量的向量。
vector< vector<Foo*> > mFooVectors;
我必须允许使用以下getFoos函数进行访问。
const vector<const Foo*>& getFoos(int index);
所以我创建了一个向量的const声明:
const vector< const vector<const Foo*> > mConstFooVectors;
现在我该怎么做mConstFooVectors = mFooVectors所以我可以返回对mConstFooVectors的引用?
答案 0 :(得分:8)
您无法在任何给定级别添加const
。模板的不同实例化是不同的不相关类型,vector<T>
与vector<const T>
无关,并且无法将投射从一个投射到另一个。
另一方面,您可以创建一个不同的向量并只复制内容,但这可能很昂贵,因为您必须复制所有不同的包含向量。
顺便说一下,如果你返回一个const引用到外部向量,const引用将表现为:const std::vector< const std::vector< Foo * const > >&
,请注意,由于与C ++中的类型相关的值语义,const-ness 传播 in。问题是存储在内部向量中的值是一个指针,并且使该指针保持不变不会使指向对象保持不变。同样,getFoos(int)
的行为也相当于const std::vector< Foo * const >&
。请注意,这是行为而不是实际类型。
答案 1 :(得分:1)
我不知道你要做什么,但我要看一下boost :: ptr_vector
特别是,如果你没有正确处理它,你的矢量成员可能会泄漏......(RAII)
答案 2 :(得分:0)
vector的复制构造函数应该能够处理它,但是你必须在类的构造函数的初始化列表中执行它,因为它是一个const成员。
编辑:那是错的... Vector的复制构造函数无法处理它。请参阅David Rodriguez的帖子以获得解释(向量和向量是不相关的类型)。
答案 3 :(得分:0)
你正在混合
vector<const Foo *>
带
vector<Foo *>
你必须决定你想要哪一个 - 没有办法从一个转换到另一个(没有复制)。