为什么我不能从这个模板函数返回引用?

时间:2015-11-05 13:57:18

标签: c++ templates reference return-type

我直接从一本书(Sams Teach Yourself C++ in One Hour a Day)中得到了这个例子:

// Get the maximum of two values
template <typename objectType>
objectType& GetMax(const objectType& value1, const objectType& value2)
{
    if (value1 > value2)
        return value1;
    else
        return value2;
}

本质上,它是一个非常详细的模板函数,用于查找任何类型的2个值之间的最大值。

我试图按如下方式使用该功能:

// Test the Max function
int x_int = 25;
int y_int = 40;
int max_int = GetMax(x_int, y_int);
cout << "max_int: " << max_int << endl;

double x_double = 1.1;
double y_double = 1.001;
double max_double = GetMax(x_double, y_double);
cout << "max_double: " << max_double << endl;

但是,当我尝试编译并运行代码时,我收到以下错误:

  

错误1错误C2440:'return':无法从'const int'转换为'int&amp;'

     

错误2错误C2440:'return':无法从'const int'转换为'int&amp;'

     

错误3错误C2440:'return':无法从'const double'转换为'double&amp;'

     

错误4错误C2440:'return':无法从'const double'转换为'double&amp;'

如果我只是从函数的返回类型中删除&,它将编译并成功执行。

为什么我不能从此函数返回引用?这本书是错的,还是我遗失的东西?

4 个答案:

答案 0 :(得分:7)

这里的问题是参数声明的const部分。变量value1value2是对常量值的引用,但是您返回对非常量值的引用。

答案 1 :(得分:5)

错误解释了这一切,您无法返回对const引用的非const引用。

// Get the maximum of two values
template <typename objectType>
const objectType& GetMax(const objectType& value1, const objectType& value2)
{
    if (value1 > value2)
        return value1;
    else
        return value2;
}

答案 2 :(得分:1)

您应该指出错误引用的行(以及发布其他人可以复制/粘贴到其编辑器中的完整程序)。

但我希望他们参考这一行

return value1;

和之后类似​​的一个。错误告诉你究竟出了什么问题:

cannot convert from 'const int' to 'int &'

当然,如果我们调查这条线试图做的细节,我们会发现你想要返回的东西是const:

const objectType& value1

但函数承诺返回的类型是一个非常规引用:

objectType& GetMax

答案 3 :(得分:0)

函数GetMax的返回类型是一个引用,但是您尝试返回一个const引用的变量。

这是不允许的,编译失败。

尝试使用const_castvalue1上的value2来绕过此机制是危险的,因为从最初{{1}的值中删除const ness的行为未定义。

显而易见的事情是将const的返回类型更改为GetMax引用。