【C++】模板一些概念和例题的理解

1.在模板定义中,模板参数列表不能为空

2.非类型模板参数的模板实参必须是常量表达式,表示一个值而非一个类型

3.函数模板可以声明为inline或constexpr的,正确的方式是inline说明符跟在模板参数列表之后。

4.模板程序应该尽量减少对实参类型的要求

5.函数模板和类模板成员函数的定义通常放在头文件中

6.大多数编译错误在实例化期间报告,调用者应保证传递给模板的实参支持模板所要求的操作,以及这些操作在模板中能正确工作

7.一个类模板的每个实例都形成一个独立的类,不会对其他任何模板类型的成员有特殊访问权限

8.默认情况下,对于一个实例化了的类模板,其成员只有在使用时才被实例化

9.在一个类模板的作用域内,可以直接使用模板名而不必指定模板实参

10.一个特定文件所需要的所有的声明通常一起放置 在文件的开始位置,出现于任何使用这些模板的代码之前

例题1.建立一个求最大值的函数模板

运行通过的代码:

#include <iostream>
#include <string>

using namespace std;

template <typename MX>
MX MAX(MX x,MX y)
{
    return (x>y)?x:y;
}
int main()
{
    int i1 = 1, i2 = 2;
    double d1 = 30.1, d2= 22.5;
    char c1 = 'a',c2 = 'A';
    cout << "较大的整数是:" << MAX(i1,i2) << endl;
    cout << "较大的双精度数是:" << MAX(d1,d2) << endl;
    cout << "ASCII码值较大的字符是:" << MAX(c1,c2) << endl;
    return 0;
}

运行结果展示:
在这里插入图片描述

出现问题:
使用codeblocks的g++编译器刚开始定义模板的时候,我做了如下定义:

template <typename MX>
MX max(MX x,MX y)
{
    return (x>y)?x:y;
}

但是在运行时,出现了
call of overloaded ‘max(int&, int&)’ is ambiguous
提示重载“max(int&,int&)”的调用是不明确的。

但是根据最初学习的课件内容,这样的调用是可以实现的,但是为什么自己编译时会出现错误呢。百思不得其解时,查阅了网上各大论坛对于这个问题的解释,有一个问题让我非常在意。

This code passed under vc6 but failed under g++.

下面的第一条回复是:

It’s because you’ve imported all of the std namespace, which is a no-no. Note the other candidates are template std::min.

然后我明白了为什么这样做会提示我模糊调用。

我已经使用using namespace std,将整个标准库包含进了我的代码,但没有在意其实codeblocks已经使用绿色代码高亮向我标注出max本身是一个存在于标准库中的函数,因此我所写的代码实际上造成了模板函数和标准函数的二义性。因此当我将max改为MAX后,不再占用标准函数库已有的函数名,就可以正常的在codeblocks的g++编译器上运行了。

除此之外,根据论坛的答复还有一种修改方法,就是将using namespace std去掉,将cout和endl加入std::的操作,也可以实现max的功能。

另一版实现代码如下:

#include <iostream>
#include <string>

template <typename MX>
MX max(MX x,MX y)
{
    return (x>y)?x:y;
}
int main()
{
    int i1 = 1, i2 = 2;
    double d1 = 30.1, d2= 22.5;
    char c1 = 'a',c2 = 'A';
    std::cout << "较大的整数是:" << max(i1,i2) << std::endl;
    std::cout << "较大的双精度数是:" << max(d1,d2) << std::endl;
    std::cout << "ASCII码值较大的字符是:" << max(c1,c2) << std::endl;
    return 0;
}

私以为将函数名进行替换的工作量小于用ctrl+r修改cout和endl的工作量,但是将两版代码都附上了。如果这里换函数名做得不对,希望大家指正。

例题2.建立一个求最大值的类模板,且在类模板外定义成员函数

踩了例题1的坑之后,在做例题2的时候记住了要把max换成MAX,再套用类外定义成员函数的方法,就可以正常写出结果了。

代码示例:

#include <iostream>

using namespace std;

template <typename CP>
class Compare
{
    CP x,y;
    public:
        Compare(CP x, CP y);
        CP MAX();
};
template <typename CP>
Compare<CP> :: Compare(CP a, CP b)
{
    x = a;
    y = b;
}
template <typename CP>
CP Compare<CP> :: MAX()
{
    return (x>y)?x:y;
}
int main()
{
    Compare<int> com1(1,2);
    Compare<double> com2(30.1,22.5);
    Compare<char> com3('a','A');
    cout << com1.MAX() << endl;
    cout << com2.MAX() << endl;
    cout << com3.MAX() << endl;
}

参考材料:C++prime plus 第五版 学校课程课件 论坛关于相关问题的部分解释

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值