关于一些无法编译的代码的一个非常快速的问题。 我在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 );
但我不明白为什么......
`
答案 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)。