我正在使用C ++进行在线课程(Pluralsight.com)并在模板练习中苦苦挣扎,特别是将实际数字(例如3
)传递给期望{{1}的模板}。
教师编写的代码不会在我的电脑上编译 - 我相信我理解为什么它不会编译,但想知道它是如何编译给教师(演示者)以及如何处理这种情况。
(T& t)
编辑:修复了代码中的拼写错误(来自我在提问之前的实验)。它似乎在https://ideone.com/1cjJUD中运行,所以我现在不确定它为什么不能为我编译! (谢谢@ user4581301)
EDIT2 回复后,更改功能名称以避免混淆。应该让那些偶然发现同样事情的人更加清楚。 https://ideone.com/dZffn6
编译器错误为#include "stdafx.h"
#include <iostream>
template <class T>
T myMax(T& t1, T& t2)
{
return t1 < t2 ? t2 : t1;
}
int main()
{
int result = myMax(3, 4);
return result;
}
这看起来像是失败,因为"C2664 'T max<int>(T &,T &)': cannot convert argument 1 from 'int' to 'int &"
是实际数字而不是对存储在某处的数字的引用。声明3
并将int a=3;
传递给我的max函数可以正常工作。
答案 0 :(得分:3)
因为您按价值返回,所以参数不是非const
的理由。 rvalues(包括文字和临时对象)与const
引用兼容。因此,如果不处理所有可能的组合,这将是一个很好的解决方法:
template <class T>
T myownmax(T const& t1, T const& t2)
{
return t1 < t2 ? t2 : t1;
}
请注意,我已重命名该功能,以避免与std::max
产生歧义。 Neil提到删除评论中的using namespace std;
- 虽然该行确实触发了问题,但删除它并不是一个完整的解决方案。
特别是,即使没有using namespace std;
,代码std::complex<double> a, b; auto c = max(a, b);
仍会找到std::max
,从而打败了使您的函数成为模板的整个目的,因此它适用于任何类型!这是&#34;参数依赖查找的结果&#34;。
因此,使用其他名称是最佳选择。