我正在尝试初始化自定义类型dataCard
的矢量:
vector<dataCard> dataSet;
dataSet.reserve(200);
然而,编译器不允许我这样做,表明第二行出错(我试图为容器保留空间):
required from here
但是,当我将声明更改为以下
时vector<dataCard*> dataSet;
它开始工作。
编译器不允许我按原样使用我的类型的原因是什么,但是让我使用指向该类型的指针?我实际上需要一个对象向量,而不是指向它们的指针。
修改
dataCard
#include <card.h>
class dataCard {
char* name; // name according to the filename
char Class; // Classes: 2, 3, 4, 5, 6, 7, 8, 9, T, J, Q, K, A
double distanceToQuery;
public:
void resetDistance();
int numBlackTotal (bitmap* bmp);
bitmap image;
int numOfBlackPixels;
char* getName();
void setName(char* n);
void setClass (char* c);
char* getClass();
void setDistance(double distance);
double getDistance ();
dataCard(const char* fname);
dataCard();
virtual ~dataCard();
};
这是来自编译器
的错误消息/usr/include/c++/4.7/bits/stl_uninitialized.h:77:3: required from ‘static _ForwardIterator std::__uninitialized_copy<_TrivialValueTypes>::__uninit_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = dataCard*; _ForwardIterator = dataCard*; bool _TrivialValueTypes = false]’
/usr/include/c++/4.7/bits/stl_uninitialized.h:119:41: required from ‘_ForwardIterator std::uninitialized_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = dataCard*; _ForwardIterator = dataCard*]’
/usr/include/c++/4.7/bits/stl_uninitialized.h:260:63: required from ‘_ForwardIterator std::__uninitialized_copy_a(_InputIterator, _InputIterator, _ForwardIterator, std::allocator<_Tp>&) [with _InputIterator = dataCard*; _ForwardIterator = dataCard*; _Tp = dataCard]’
/usr/include/c++/4.7/bits/stl_vector.h:1112:8: required from ‘std::vector<_Tp, _Alloc>::pointer std::vector<_Tp, _Alloc>::_M_allocate_and_copy(std::vector<_Tp, _Alloc>::size_type, _ForwardIterator, _ForwardIterator) [with _ForwardIterator = dataCard*; _Tp = dataCard; _Alloc = std::allocator<dataCard>; std::vector<_Tp, _Alloc>::pointer = dataCard*; std::vector<_Tp, _Alloc>::size_type = long unsigned int]’
/usr/include/c++/4.7/bits/vector.tcc:76:70: required from ‘void std::vector<_Tp, _Alloc>::reserve(std::vector<_Tp, _Alloc>::size_type) [with _Tp = dataCard; _Alloc = std::allocator<dataCard>; std::vector<_Tp, _Alloc>::size_type = long unsigned int]’
/home/ppsadm01/Documents/vgv/src/main.cc:145:22: required from here
/usr/include/c++/4.7/bits/stl_construct.h:85:7: error: no matching function for call to ‘dataCard::dataCard(const dataCard&)’
答案 0 :(得分:2)
如果编译器不知道dataCard
对象的大小,则无法为其保留空间。但是指针总是一个已知的大小,所以它可以为此保留空间。
我的猜测是编译器不知道dataCard
对象的确切大小。例如,如果bitmap
类型对象的大小可变,那么编译器将不知道dataCard
的大小。
答案 1 :(得分:2)
由于错误消息表明您需要实现复制构造函数dataCard::dataCard(const dataCard&)
。您需要这样做,因为例如vector<dataCard>::push_back()
将复制dataCard
个实例。
编写复制构造函数时,请注意以正确的方式复制所有成员变量。所以一个示例实现可能是
dataCard::dataCard(const dataCard &rhs)
{
strcpy(name, rhs.name);
Class = rhs.Class;
distanceToQuery = rhs.distanceToQuery;
image = rhs.image; // make sure that this is OK!
}