以下代码:
#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);
我认为它被视为右值,但为什么?
答案 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) {