请教一个关于vector中push_back的问题。谢谢!!!
下面是我的代码,在VS2003下编译总是出现如下编译错误:
error C2036: “const std::vector <_Ty> ::pointer” : 未知的大小
我建的是一个控制台的程序。如果双击这个错误就定位到vector的内部实现代码了。可是如果把FaultPolyLine.push_back(temp_Polyline); 这一行注释掉的话编译可以通过。不知是何原因,怀疑是不是push_back的问题,困扰小弟很长时间,请各位帮帮忙!谢谢!!!!
#include "stdafx.h "
#include "KeyPillarUtil.h "
#include "PolyLine3D.h " // 一个自己写的PolyLine3D类
#include <algorithm>
bool WorseThan(const Point3D& pts, const Point3D& pte)
{
if(pts.GetZ() <= pte.GetZ())
return true;
else
return false;
}
void KeyPillarUtil::ResamplingKeyPillar(const vector < vector <Point3D> > & vecPolyines,double dSampleDis, FaultPlane3D* pFP3D )
{
double temp_dSampleDis = dSampleDis;
vector <PolyLine3D> FaultPolyLine;
// vector < Point3D > ::iterator itLine;
vector < vector <Point3D> > ::const_iterator itPlane;
vector < PolyLine3D > ::iterator itPolyLine;
for(itPlane = vecPolyines.begin(); itPlane != vecPolyines.end (); itPlane++)
{
PolyLine3D temp_Polyline(*itPlane);
FaultPolyLine.push_back(temp_Polyline); // 问题所在行
}
Point3D temp_point;
Point3D temp_ptEnd;
Pillar3D temp_pillar;
for(itPolyLine = FaultPolyLine.begin(); itPolyLine != FaultPolyLine.end(); itPolyLine++)
{
//itPolyLine-> FromTopPoint(0.0, &temp_point);
//temp_pillar.vecPoint.push_back(temp_point);
}
sort(temp_pillar.vecPoint.begin(), temp_pillar.vecPoint.end(), WorseThan);
pFP3D-> vecPillar.push_back(temp_pillar);
bool bSampleFlag = true;
while(bSampleFlag)
{
for(itPolyLine = FaultPolyLine.begin(); itPolyLine != FaultPolyLine.end(); itPolyLine++)
{
//itPolyLine-> FromTopPoint(temp_dSampleDis,&temp_point);
//itPolyLine-> FromEndPoint(0.0,&temp_ptEnd);
if(temp_point == temp_ptEnd)
bSampleFlag |= false;
temp_pillar.vecPoint.push_back(temp_point);
}
sort(temp_pillar.vecPoint.begin(), temp_pillar.vecPoint.end(), WorseThan);
pFP3D-> vecPillar.push_back(temp_pillar);
temp_dSampleDis += dSampleDis;
}
}
其中头文件KeyPillarUtil.h定义如下:
#ifndef KEYPILLARUTIL_H_
#define KEYPILLARUTIL_H_
#include <string>
#include <vector>
using namespace std;
#include "Point3D.h " // 是一个自己写的Point3D的类
#include "Vector3D.h " // 是一个自己写的Vector3D类
struct Pillar3D
{
vector <Point3D> vecPoint;
};
struct FaultPlane3D
{
string strFaultName;
vector < Pillar3D > vecPillar;
};
struct KeyPillarUtil
{
static void ResamplingKeyPillar( const vector < vector <Point3D> > & vecPolyines,
double dSampleDis, FaultPlane3D* pFP3D );
};
#endif
[解决办法]
PolyLine3D temp_Polyline(*itPlane);
*itPlane是vector <Point3D> ,
它可以用来构建PolyLine3D吗?
把PolyLine3D的代码贴出来吧:)
[解决办法]
double temp_dSampleDis = dSampleDis;
vector <PolyLine3D> FaultPolyLine;
// vector < Point3D > ::iterator itLine;
vector < vector <Point3D> > ::const_iterator itPlane;
vector < PolyLine3D > ::iterator itPolyLine;
for(itPlane = vecPolyines.begin(); itPlane != vecPolyines.end (); itPlane++)
{
PolyLine3D temp_Polyline(*itPlane);
FaultPolyLine.push_back(temp_Polyline); // 问题所在行
}
> itPlane对二维向量进行遍历
> 以二维的大小去增加一个PolyLine3D类型的向量?
> PolyLine3D类型的向量的大小是多少,就算已知,也不一定不保证越界吧
> 是PolyLine3D的问题
[解决办法]
up
[解决办法]
重新建一下工程
[解决办法]
最好dll只导出C风格的东西
========================
mark之
[解决办法]
vector <PolyLine3D> FaultPolyLine;
// vector < Point3D > ::iterator itLine;
vector < vector <Point3D> > ::const_iterator itPlane;
你的这个声明中,注释掉的那行和第一行是匹配的,如果你想按第三行的实现,则第一行应为:
vector < vector <Point3D> > FaultPolyLine;
[解决办法]
copy constructor 有问题:
PolyLine3D::PolyLine3D( const vector <Point3D> & vecPoint )
{
vector <Point3D> ::const_iterator cit = vecPoint.begin();
for( cit ++; cit != vecPoint.end(); cit ++ )
{
vector <Point3D> ::const_iterator cit1 = cit;
cit1 --;
Segment3D seg( *cit1, *cit );
m_vecSeg3D.push_back( seg );
}
}
如果vecPoint是空的,那么进入循环时,cit是vecPoint.end()之后的一个元素,这里有异常