2013-01-01 305 views
3

我对创建我的模板类时发生了什么感到有些莫名其妙。我试图在构建过程中将成员vector_的容量设置为50(仅一次),但容量似乎从未正确设置,所以显然我不明白这应该如何完成。我已经包含了相关的代码片段以及控制台输出。感谢您的帮助!对于矢量C++初始化模板类

模板类:

的R
template <typename T> 
class V 
{ 
    public: 
    V() 
    { 
     std::cout << "capacity 1 = " << this->vector_.capacity() << "\n"; 
    }; 
    V(int capacity) 
    { 
     this->vector_.reserve(capacity); 
     std::cout << "capacity 2 = " << this->vector_.capacity() << "\n"; 
    }; 
    int capacity() const { return this->vector_.capacity(); }; 
    private: 
    std::vector<T> vector_; 
}; 

构造,其中它被初始化:

R::R() 
{ 
    std::cout << "capacity 0 = " << this->s_.capacity() << "\n"; 
    this->s_ = V< std::vector< std::complex<float> > >(50); 
    std::cout << "capacity 3 = " << this->s_.capacity() << "\n"; 
}; 

R类别的部首:

class R 
{ 
    public: 
    R(); 
    private: 
    V< std::vector< std::complex<float> > > s_; 
}; 

输出到控制台:

capacity 1 = 0 
capacity 0 = 0 
capacity 2 = 50 
capacity 3 = 0 
+0

缺少_copy-constructor_也许?生成该输出的代码是什么? –

+0

这是如何编译的? 's_'的类型是'V',它没有方法'capacity' ... –

+0

另外,让V()返回一些东西,比如说类vector的引用,这是problaby为什么你R中的最后一行构造函数令你感到困惑。 – johnathon

回答

4

您不设置std::vector<T>的大小,但它的容量。容量不是std::vector<T>的显着属性,因此不会被复制。您需要使用resize()来设置大小。

+0

我怎么会正确地设置容量,因为它似乎我必须使用复制构造函数?或者是有另一种方式来使用单个构造函数,因为我只想实例化一次,但在R的构造函数中... – wrapperapps

+1

@wrapperapps:您将需要提供一个副本构造函数(和一个副本分配,如果您分配的对象)哪复制'capacity()'。请注意,即使设置非零容量,向量的大小将保持不变,即它是空的,但分配内存 –

+0

谢谢,我通过添加: V&operator =(V const&copy) {this_> vector_ = copy.vector_; this-> vector_.reserve(copy.vector_.capacity()); return * this; }; – wrapperapps