gpt4 book ai didi

C++ 模板 ByRef 与 ByVal

转载 作者:行者123 更新时间:2023-11-30 02:23:07 24 4
gpt4 key购买 nike

我正在学习 C++ 在线类(class) (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;
}

编辑: 修正了代码中的拼写错误(来 self 提出问题之前的实验)。它似乎在 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 函数工作正常。

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

最佳答案

因为您按值返回,所以参数没有理由不是 const .右值(包括文字和临时对象)与 const 兼容引用。因此,这将是一种无需处理所有可能组合即可解决问题的好方法:

template <class T>
T myownmax(T const& t1, T const& t2)
{
return t1 < t2 ? t2 : t1;
}

请注意,我已重命名该函数以避免与 std::max 产生歧义。 .尼尔提到删除 using namespace std;在评论中——虽然该行确实触发了问题,但删除它并不是一个完整的解决方案。

特别是,即使没有 using namespace std; , 代码 std::complex<double> a, b; auto c = max(a, b);仍然会找到 std::max ,破坏了使您的函数成为模板以使其适用于任何类型的全部目的!这是“参数相关查找”的结果。

所以使用不同的名称是最好的选择。

关于C++ 模板 ByRef 与 ByVal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46497517/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com