矢量初始化的向量

时间:2013-09-16 13:33:35

标签: c++ stdvector

关于一些无法编译的代码的一个非常快速的问题。 我在std :: vector:

周围写了一个包装器
template <class T>
class CLArray
{
public:
    /// Constructor, destructor.
    CLArray( const size_t size );
    CLArray( const size_t size, const T value );
    ~CLArray();

    /// Copy constructor and copy assignment operator.
    CLArray( const CLArray& rhs );
    CLArray& operator=( const CLArray& rhs );

    /// Move constructor and move assignment operator.
    CLArray( CLArray&& rhs );
    CLArray& operator=( CLArray&& rhs );

    void swap( CLArray& other )
    {
        std::swap( data_, other.data_ );
    }

    typedef typename std::vector<T>::iterator iterator;
    typedef typename std::vector<T>::const_iterator const_iterator;

    iterator begin()
    {
        return data_.begin();
    }

    const_iterator begin() const
    {
        return data_.begin();
    }

    iterator end()
    {
        return data_.end();
    }

    const_iterator end() const
    {
        return data_.end();
    }

    T& operator[]( const size_t index ) throw(CLException);
    T  operator[]( const size_t index ) const throw(CLException);

    T At( const size_t index ) const throw(CLException);
    void SetAt( const size_t index, const T& value ) throw(CLException);

    void Insert( ubyte* data, const size_t size );

    size_t GetSize() const;

    const CLArray<T>& GetData() const;

    void Clear();

private:
    std::vector<T> data_;
};

我想创建一个用于管理二维CLArray的类:

template <class T>
class SomeMap
{
public:
    SomeMap( const size_t width, const size_t heigth, const T defaultVal = 0 )
        : map_( width, CLArray<T>(heigth, defaultVal) )
    {
        // Allocate enough memory for all objects
    }

    ~SomeMap() {}

private:
    CLArray<CLArray<T>> map_;
    //std::vector<std::vector<T>> map_;
};

我在声明对象no matching function for call to ‘CLArray<Cell*>::CLArray()时遇到错误:SomeMap<Cell*> map( 748, 480, nullptr );但我不明白为什么...... `

2 个答案:

答案 0 :(得分:1)

您的班级CLArray<>缺少默认构造函数。这是type的{​​{1}}参数所必需的,并且在其默认构造函数中使用。在您的情况下std::vector<type>

顺便说一句,在没有添加任何功能的情况下包装工作代码永远不是一个好主意。

答案 1 :(得分:1)

CLArray没有默认构造函数,vector的几种方法要求T是默认的可构造的

实例化时:

SomeMap<Cell*> map( 748, 480, nullptr );

SomeMap有一个私人成员:

CLArray<CLArray<T>> map_;

CLArray在您的私有成员的情况下存储vector<T>,T是CLArray。这使得SomeMap的成员评估为vector<CLArray<Case*>>,而vector要求所包含的对象是默认可构造的。 CLArray没有默认构造函数。因此,在向量的代码中,您可能会遇到编译器错误,它会尝试实例化T。

您可能希望CLArray具有默认构造函数。但是,当您指定任何构造函数时,您将丢失默认情况下C ++为您提供的默认构造函数。 (见here)。