2015-11-05 33 views
2

我把这个例子直出一本书(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:“回归':不能转换从 'const int的' 到 '廉政&'

错误2错误C2440: '回归':不能从转换 'const int的' 到 '廉政&'

错误3错误C2440:“回归”:不能从“常量双”转换为“双&”

错误4错误C2440:“回归”:不能从“常量双”转换为“双&”


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

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

+1

你应该返回'const&' – JSF

回答

7

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

+0

就是这样!奇怪的是我添加了“const”之后,Visual Studio决定用红色强调它约10秒,这让我认为它是一个错误,即使它不是...... * facepalm * – tjwrona1992

5

错误解释这一切,你不能返回一个非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; 
} 
1

您应说明什么线的误差是指(以及发布一个完整的程序,别人可以复制/粘贴到自己的编辑器)。

但我希望他们指的这条线

return value1; 

和之后类似​​的一个。这些错误告诉你什么是错的:

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

果然,如果我们调查的这行正试图做的细节,我们看到你正试图返回的是常量:

const objectType& value1 

但功能承诺返回类型是一个非const refernce:

objectType& GetMax 
0

功能GetMax的返回类型是一个参考,但你试图retur n是一个const参考的变量。

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

试图使用const_castvalue1value2规避这种机制是危险的,因为从那是一个价值虚掷const内斯的行为原本const是不确定的。

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

相关问题