C ++模板ByRef与ByVal

时间:2017-09-29 22:07:12

标签: c++ templates byref byval

我正在使用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函数可以正常工作。

  1. 我是否正确编译失败的原因?
  2. 教师代码如何编译而没有错误?在最近的C ++版本中是否有所改变(我认为该类使用的是C ++ 03)?
  3. 是否可以编写一个模板,我可以传递ByRef或ByVal?我最终会得到4个案例(a,b); (a&amp;,b); (a,b&amp;); (a&amp;,b&amp;)?

1 个答案:

答案 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;。

因此,使用其他名称是最佳选择。