在模板类中通过引用传递

Pass by reference within template class

本文关键字:引用      更新时间:2023-10-16

我的基类中有一个成员函数,它通过引用接受参数:

// Base
template<class Data, class Variable_Type = double>
class Parallel_Data
{
...
void FuncA(Data& data, int& Global_ID) 
{Data_Local.push_back(data); Local_To_Global_ID.push_back(Global_ID);};
}
// Derived
class Derived: public Parallel_Data<Atom_Placed>

问题是当我尝试在派生成员函数中调用该函数时

Push_Back_This_CPU(Atom_Placed(Position_Atom), Global_ID);

我收到以下错误

no known conversion for argument 1 from ‘Atom_Placed’ to ‘Atom_Placed&’

我只是想通过引用传递参数,不知道它为什么要转换?

Atom_Placed(Position_Atom)这样的临时不能绑定到非常量引用,例如参数Atom_Place&。原因是它们是临时物体,现在随时都会死去。

您可以创建一个类型为 Atom_Placed 的局部变量,并将其传递给函数Push_Back_This_CPU

Atom_Placed tmp(Position_Atom);
Push_Back_This_CPU(tmp, Global_ID);

不能将临时值绑定到非常量左值引用。但是,由于您的函数不需要修改其参数,最简单的解决方案是采用const引用:

void FuncA(Data const & data, int const & Global_ID) 
//              ^^^^^             ^^^^^

现在,您可以将临时值传递给函数。

(注意:我假设Data_LocalLocal_To_Global_ID具有标准的容器接口。如果他们的push_back函数也接受非常量引用,那么它们也需要修复。