读书人

c2663异常

发布时间: 2012-02-11 09:51:34 作者: rapoo

c2663错误
大家好,我这里有个问题,还请多多指教,以下是简化了的代码

class Clarc;
class Clnode;

头文件
// larcPtr是指向Clarc对象的句柄
class larcPtr {
public:
larcPtr():p(0), use(new std::size_t(1)) { }
larcPtr(Clarc &Arc):p(&Arc),use(new std::size_t(1)){}
larcPtr(const larcPtr &i):p(i.p), use(i.use) { ++*use; }
~larcPtr() { decr_use(); }
larcPtr& operator=(const larcPtr&);
const Clarc *operator->() const { if (p) return p;
else throw std::logic_error("unbound larcPtr"); }
const Clarc &operator*() const { if (p) return *p;
else throw std::logic_error("unbound larcPtr"); }

protected:
Clarc *p; // pointer to shared item
std::size_t *use;
void decr_use()
{ if (--*use == 0) { delete p; delete use; } }
};

class Clarc {

friend Clnode;
friend lnodePtr;
public:
Clarc():start(),end(),preEndTim(0.0),endTim(0.0),
farc(),parc(),aclike(0.0),nAlign(0),score(0.0),
prlike(0.0),fwrd(),word(""),BackBiPrb(0.0),ForBiPrb(0.0){}
Clarc(const Clarc&);
virtual ~Clarc(){}

const larcPtr& GetFwrd() const {return fwrd;}

Clarc& SetFwrd (Clarc& item){fwrd=larcPtr(item); }
Clarc& SetFwrd() {fwrd = larcPtr(*this); }
Clarc& SetFwrd(larcPtr &itemPtr){fwrd=itemPtr;}

protected:
larcPtr fwrd;

};




cpp文件的一个函数

void initialize(a_v_type &Vlarcs, n_v_type &Vlnodes, lattice *lat)
{

stable_sort_arcnode(lat->larcs, lat->lnodes, Vlarcs, Vlnodes, CmpEndStrTim, CmpNodeTim);//这个是对Vlarcs 和Vlnodes排序,因为涉及其它问题,所以是自己写的程序。
// 函数原型为 void stable_sort_arcnode(LArc *larcs, LNode *,vector<Clarc> &va, vector<Clnode> &vn, compArc comp1,compNode comp2);
//其中的compArc和 compNode 是函数指针,至于LArc 和 LNode 是两个指向结构体数组的指针。

for (arc_iter_type iter=Vlarcs.begin();iter!=Vlarcs.end();++iter){
iter->SetFwrd();
}

stable_sort(Vlarcs.begin(),Vlarcs.end(),cmpEndTim1);

vector<larcPtr> fwrdCopV;

arcPtr_size_type i=0; // typedef vector<larcPtr>::size_type arcPtr_size_type;

for (arc_iter_type iter=Vlarcs.begin();iter!=Vlarcs.end();++iter){
fwrdCopV.push_back(iter->GetFwrd());
}

arcPtr_size_type i=0;// typedef vector<larcPtr>::size_type arcPtr_size_type;

for (arc_iter_type iter=Vlarcs.begin();iter!=Vlarcs.end();++iter){
if (&(*(iter->GetFwrd()))!=&(*iter)){
(*(fwrdCopV[i])).SetFwrd(*iter); --------------------》出现C2663错误的语句
}
++i;
}
}

编译时出现c2663错误,如下Compiling HTKLib...
compiling HGraph.cpp
HGraph.cpp
HGraph.cpp(183) : error C2663: 'Clarc::SetFwrd' : 3 overloads have no legal conv
ersion for 'this' pointer
HGraph.cpp(193) : error C2780: '_FwdIt std::max_element(_FwdIt,_FwdIt,_Pr)' : ex
pects 3 arguments - 1 provided
C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE\algorithm(3786) :
see declaration of 'std::max_element'
HGraph.cpp(193) : error C2780: '_FwdIt std::max_element(_FwdIt,_FwdIt)' : expect
s 2 arguments - 1 provided
......省略......

其中的第一个错误C2663错误,我上网查了一下,基本上是发生在用const对象调用非const成员函数的情况下,可是出错的那行代码中,我没有使用const对象呀

实在搞不懂,还请高人多多指教

[解决办法]
const Clarc *operator-> () const { if (p) return p;
else throw std::logic_error("unbound larcPtr"); }
在这里。
提供一个非const版本

读书人网 >C++

热点推荐