内联产生的奇怪问题


今天在写代码时,遇到个因为内联而产生的奇怪问题。代码如下:

int LogicSoldierManager::Process(unsigned uid, ProtoSoldier::RecruitSoldierReq * req, ProtoSoldier::RecruitSoldierResp * resp)
{
	Recruit(uid, req->soldierids(), req->nums(), resp);

	return 0;
}

int LogicSoldierManager::Recruit(unsigned uid, const google::protobuf::RepeatedPtrField<google::protobuf::uint32>& soldierIds,
		const google::protobuf::RepeatedPtrField<google::protobuf::uint32>& nums, ProtoSoldier::RecruitSoldierResp * resp)
{
	//判断参数是否合法
	if (soldierIds.size() != nums.size())
	{
		throw runtime_error("param_error");
	}
}
就是这样简单的代码,可是在编译的时候,还是遇到了神奇的报错。
LogicSoldierManager.cpp:90: error: no matching function for call to ‘LogicSoldierManager::Recruit(unsigned int&, const google::protobuf::RepeatedField<unsigned int>&, const google::protobuf::RepeatedField<unsigned int>&, ProtoSoldier::RecruitSoldierResp*&)’


LogicSoldierManager.h:32: note: candidates are: int LogicSoldierManager::Recruit(unsigned int, const google::protobuf::RepeatedPtrField<unsigned int>&, const google::protobuf::RepeatedPtrField<unsigned int>&, ProtoSoldier::RecruitSoldierResp*)

明明我的Recruit 方法中的参数就是unsigned , &, &, ProtoSoldier::RecruitSoldierResp*,这样的类型,可编译的时候,调用的类型却是 unsigned int&, &, &, ProtoSoldier::RecruitSoldierResp*&

    类型全都加了个引用。看了req->soldierids()的代码实现,是个内联函数。因此猜测是因为内联展开的时候,编译器做了什么神奇的操作。导致调用都变成了引用。

    后面我修改了代码,避免了这个问题。


评论

发表评论