【问题标题】:Pass by reference within template class在模板类中通过引用传递
【发布时间】:2013-01-08 15:25:06
【问题描述】:

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

// 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&’

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

【问题讨论】:

  • 这与模板无关

标签: c++ class templates parameter-passing pass-by-reference


【解决方案1】:

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

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

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

【讨论】:

  • 我有一个 Atom_Place 对象向量(不是指向对象的指针),我将其插入其中。如果我单独创建对象,它会增加一倍的内存使用量?
  • @Hesam 如果你已经有了这些对象,为什么不传递那些向量元素呢?
  • 我的意思是,我正在创建对象(没有它们)但是如果我创建 tmp(Position_Atom) 我需要每次都释放它(相对于 Push_Back_This_CPU(Atom_Placed(Position_Atom), Global_ID); ) ?
  • @Hesam 您需要查看您的数据结构:如果您在某处有一个向量是成员变量v,那么该类需要有一个成员函数push_back 可以执行@987654328 @
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2011-06-20
    • 2016-10-10
    相关资源
    最近更新 更多