直接上源代码
dev C++
**********************************************************************************************************************************
//findMid.h
#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);
// 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
#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);
//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,即都不支持分别编译!(若有错误,还请指出)