2

关于一些无法编译的代码的一个非常快速的问题。我写了一个围绕 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 );,我真的不明白为什么......`

4

2 回答 2

1

您的类CLArray<>缺少默认构造函数。这是type参数所必需的,std::vector<type>并在其默认构造函数中使用。在你的情况下type=CLArray<Cell*>

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

于 2013-09-16T13:37:09.180 回答
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++ 默认为您提供的默认构造函数。(见这里)。

于 2013-09-16T13:38:54.000 回答