模板中typename的作用

直接上源代码

dev C++

**********************************************************************************************************************************

//findMid.h

#ifndef _FIND_MID_
#define _FIND_MID_
#include<vector>
#include<algorithm>
#include<iostream>
template<typename T1,typename T2>
T1 findMid(const T2& p1,const T2 &p2);
#endif

//findMid.cpp

#include"findMid.h"
//export  //目前还不支持“export”关键字,但已保留该关键字供将来使用

template<typename T1,typename T2>
T1 findMid(const T2& p1,const T2 &p2){
    typename std::vector<typename T2::value_type> temp(p1,p2);
    typename std::vector<typename T2::value_type>::iterator pfirst=temp.begin();
    typename std::vector<typename T2::value_type>::iterator pend=temp.end();
    std::sort(pfirst,pend);
    while(pfirst!=pend)
        std::cout<<*(pfirst++)<<' ';
    std::cout<<'\n';
    std::cout<<temp.size()<<'\n';
    return temp[temp.size()/2];
    
}

//main.cpp

#include"findMid.h"

int main(){

    int a[9]={1,3,2,7,5,4,6,9,8};

    std::vector<int> vin(a,a+9);

    //std::vector<int> vin;
   // for(int i=0;i<9;++i)
   //     vin.push_back(a[i]);

    std::cout<<(findMid<int>(vin.begin(),vin.end()))<<std::endl;
    system("pause");
    return 0;
}

**********************************************************************************************************************************

vc 2010

#############################################################################################

//findMid.h

#ifndef _FIND_MID_
#define _FIND_MID_
#include<vector>
#include<algorithm>
template<typename T1,typename T2,typename T3>
T1 findMid(const T2& p1,const T3 &p2){
    std::vector<T2::value_type> temp(p1,p2);
    std::vector<T2::value_type>::iterator pfirst=temp.begin();
    std::vector<T2::value_type>::iterator pend=temp.end();
    std::sort(pfirst,pend);
    while(pfirst!=pend)
        std::cout<<*(pfirst++)<<' ';
    std::cout<<'\n';
    std::cout<<temp.size()<<'\n';
    return temp[temp.size()/2];
}

#endif

//main.cpp

#include"findMid.h"
int main(){

    int a[9]={1,3,2,7,5,4,6,9,8};

    std::vector<int> vin(a,a+9);

    //std::vector<int> vin;
    //for(int i=0;i<9;++i)
    //    vin.push_back(a[i]);

    std::cout<<findMid<int,std::vector<int>::iterator>(vin.begin(),vin.end())<<std::endl;
    return 0;
}

#############################################################################################

对比:

=====dev=====

    std::vector<typename T2::value_type> temp(p1,p2);


    typename std::vector<typename T2::value_type>::iterator pfirst=temp.begin();


    typenamestd::vector<typename T2::value_type>::iterator pend=temp.end();

====vc2010====

    std::vector<T2::value_type> temp(p1,p2);
    std::vector<T2::value_type>::iterator pfirst=temp.begin();

    std::vector<T2::value_type>::iterator pend=temp.end();

通过对比发现在dev中使用模版类型定义时必须加关键字 typename,用以向编译器指明这是一个类型;而在vc中则可以不加此关键字!

更有趣的是在dev中关于以下两行的的区别:

   std::vector<typename T2::value_type> temp(p1,p2);


    typename std::vector<typename T2::value_type>::iterator pfirst=temp.begin();

最后,说明几点,

1、通过对比发现vc编译器更智能一些(实际上我用时经常出现语法级的错误编译(不对的也能通过),并且链接经常出问题!坑爹的ms)

2、关键字typename 多用无害,但少用一些编译器就会报错!

3、关于包含编译、分别编译,

      (1)经实验,在dev中可将模版函数的实现放在cpp文件中,而函数声名放在头文件中;但是在vc中报错:无法找到定义。

                这说明dev支持包含编译,而vc不支持模版的包含编译!(若有错误,还请指出)

      (2)两种编译器均不支持关键字export,即都不支持分别编译!(若有错误,还请指出)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值