我直接从一本书(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;'
如果我只是从函数的返回类型中删除&
,它将编译并成功执行。
为什么我不能从此函数返回引用?这本书是错的,还是我遗失的东西?
答案 0 :(得分:7)
这里的问题是参数声明的const
部分。变量value1
和value2
是对常量值的引用,但是您返回对非常量值的引用。
答案 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_cast
和value1
上的value2
来绕过此机制是危险的,因为从最初{{1}的值中删除const
ness的行为未定义。
显而易见的事情是将const
的返回类型更改为GetMax
引用。