首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++模板ByRef与ByVal

C++模板ByRef与ByVal
EN

Stack Overflow用户
提问于 2017-09-29 22:07:12
回答 1查看 940关注 0票数 1

我在C++上学习一门在线课程(C++),并且很难完成一项关于模板的练习,特别是将一个实际的数字(例如3)传递给期望使用(T& t)的模板。

由指导员编写的代码不会在我的PC上编译--我相信我理解它为什么不编译,但是想知道它是如何为指导员编译的(谁演示它),以及您应该如何处理这种情况。

代码语言:javascript
复制
#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函数很好。

  1. 关于编译失败的原因,我是否正确?
  2. 教师如何在没有错误的情况下编译代码?在最近的C++版本中,这种情况是否发生了改变(我相信类使用了C++03)?
  3. 在我可以传递ByRef或ByVal的地方,是否可以编写一个模板?我最后会有4个案件(a,b);(a和,b);(a,b&);(a和,b&)?
EN

回答 1

Stack Overflow用户

发布于 2017-09-29 22:27:57

因为您是按值返回的,所以参数没有理由是非const的。rvalues (包括文字和临时对象)与const引用兼容。因此,这将是一个很好的方法来修复它,而不需要处理所有可能的组合:

代码语言:javascript
复制
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,从而破坏了使函数成为模板的全部目的,因此它可以与任何类型的函数一起工作!这是“依赖于参数的查找”的结果。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46497517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档