我在C++上学习一门在线课程(C++),并且很难完成一项关于模板的练习,特别是将一个实际的数字(例如3)传递给期望使用(T& t)的模板。
由指导员编写的代码不会在我的PC上编译--我相信我理解它为什么不编译,但是想知道它是如何为指导员编译的(谁演示它),以及您应该如何处理这种情况。
#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;
}编辑:修正了代码中的错误(从我问这个问题之前的实验开始)。它似乎在https://ideone.com/1cjJUD中运行,所以我现在不知道为什么它不会为我编译!(谢谢@user4581301)
EDIT2后答,更改函数名称以避免混淆.应该让那些无意中遇到同样事情的人更清楚地提出问题。https://ideone.com/dZffn6
编译器错误是"C2664 'T max<int>(T &,T &)': cannot convert argument 1 from 'int' to 'int &",在我看来,这似乎是失败的,因为3是一个实际的数字,而不是存储在某个地方的数字的引用。声明int a=3;并将a传递给我的max函数很好。
发布于 2017-09-29 22:27:57
因为您是按值返回的,所以参数没有理由是非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,从而破坏了使函数成为模板的全部目的,因此它可以与任何类型的函数一起工作!这是“依赖于参数的查找”的结果。
所以使用不同的名字是最好的选择。
https://stackoverflow.com/questions/46497517
复制相似问题