在模板类中通过引用传递

时间:2017-01-07 23:03:09

标签: c++ templates

以下代码:

#include <iostream>
#include <cmath>

template<class T>
class Number {
private:
 T val;
public:
 Number(T& tRefArg) : val(tRefArg) {}
 void print() {
  std::cout << val << std::endl;
 }
};

template<class R>
class RoundedNumber : public Number<R> {
public:
 R val;
public:
 RoundedNumber(R& tRefArg): Number<R>(tRefArg), val(tRefArg) {
  val = floor(val + 0.5f);
 }
 void print() {
  std::cout << val << std::endl;
 }
};

int main() {
 int i = 8;
 Number<double>* myNumber = new RoundedNumber<double>(i);
}

给出错误:

  

2.cpp:30:56:错误:从'double'类型的右值初始化'double&amp;'类型的非const引用无效     Number * myNumber = new RoundedNumber(i);

我认为它被视为右值,但为什么?

1 个答案:

答案 0 :(得分:3)

会员功能期望double,您提供int。从double创建临时int,您不能将临时绑定到引用,但可以将其绑定到const引用。
也就是说,你可以使用它:

Number(const T& tRefArg) : val(tRefArg) {}

或者这个:

Number(T tRefArg) : val(tRefArg) {}

而且:

RoundedNumber(const R& tRefArg): Number<R>(tRefArg), val(tRefArg) {

或者这个:

RoundedNumber(R tRefArg): Number<R>(tRefArg), val(tRefArg) {