【发布时间】:2018-03-11 20:55:45
【问题描述】:
我正在学习 C++ 的在线课程 (Pluralsight.com) 并努力练习模板,特别是将实际数字(例如 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 函数可以正常工作。
- 我对编译失败的原因是否正确?
- 讲师代码如何编译不出错?这在最近的 C++ 版本中是否发生了变化(我相信该类使用 C++03)?
- 是否可以编写一个可以传递 ByRef 或 ByVal 的模板?我最终会得到 4 个案例(a,b)吗? (a&, b); (a, b&); (a&, b&) ?
【问题讨论】:
-
@juanchopanza - 抱歉 - 我在复制代码和格式化时犯了一个错误 - 现在应该修复了。
-
@NeilButterworth - 我认为这没有帮助;阅读教科书和学习在线课程一样容易出现这类问题。我现在已经修复了问题中的代码,但我的问题仍然存在。
-
它选择了错误的最大值 - 去掉
using指令,你会看到一个错误。 -
应该是报错!代码错误!
-
没有。 @Neil 正在解释为什么 GCC 可以吃掉那些糟糕的代码:它不是。它使用的是
std::max,而不是max。又一次针对using namespace std;的罢工