第十六周项目3:max带来的冲突
问题及代码:
/* *Copyright (c)2015,烟台大学计算机与控制工程学院 *All rights reserved. *文件名:project.cpp *作 者:陈文青 *完毕日期:2015年6月28日 *版 本 号:v1.0 * *问题描写叙述:分析以下程序出现的编译错误,给出解决的方案。 *程序输入: *程序输出: */ #include<iostream> using namespace std; //定义函数模板 template<class T> T max(T a, T b) { return (a>b)?a:b; } int main() { int x=2,y=6; double x1=9.123,y1=12.6543; cout<<"把T实例化为int:"<<max(x,y)<<endl; cout<<"把T实例化为double:"<<max(x1,y1)<<endl; return 0; }改法1:改变函数名字。使之不与std空间内函数重名
#include<iostream> using namespace std; //定义函数模板 template<class T> T max1(T a, T b)//将函数改为max1 { return (a>b)?a:b; } int main() { int x=2,y=6; double x1=9.123,y1=12.6543; cout<<"把T实例化为int:"<<max1(x,y)<<endl; cout<<"把T实例化为double:"<<max1(x1,y1)<<endl; return 0; }
改法2:加上全局限定符,使用的是本地定义的函数
/* *Copyright (c)2015,烟台大学计算机与控制工程学院 *All rights reserved. *文件名:project.cpp *作 者:陈文青 *完毕日期:2015年6月28日 *版 本 号:v1.0 * *问题描写叙述:分析以下程序出现的编译错误。给出解决的方案。 *程序输入: *程序输出: */ #include<iostream> using namespace std; //定义函数模板 template<class T> T max(T a, T b) { return (a>b)?a:b; } int main() { int x=2,y=6; double x1=9.123,y1=12.6543; cout<<"把T实例化为int:"<<::max(x,y)<<endl;//加上全局限定符 cout<<"把T实例化为double:"<<::max(x1,y1)<<endl; return 0; }
改法3:强调max函数的命名空间
#include<iostream> using namespace std; //定义函数模板 template<class T> T max(T a, T b) { return (a>b)?a:b; } int main() { int x=2,y=6; double x1=9.123,y1=12.6543; cout<<"把T实例化为int:"<<std::max(x,y)<<endl; //强调是std空间内的函数 cout<<"把T实例化为double:"<<std::max(x1,y1)<<endl; return 0; }
改法4:去掉using namespace std;。在main中cout等std中的名称前加std::
#include<iostream> //不使用std空间 //using namespace std; //定义函数模板 template<class T> T max(T a, T b) { return (a>b)?a:b; } int main() { int x=2,y=6; double x1=9.123,y1=12.6543; std::cout<<"把T实例化为int:"<<max(x,y)<<std::endl; //声明endl和cout的空间 std::cout<<"把T实例化为double:"<<max(x1,y1)<<std::endl; return 0; }
改法5:仅仅使用std空间里的cout和endl
#include<iostream> using std::cout;//仅仅使用std空间里的cout和endl using std::endl; //定义函数模板 template<class T> T max(T a, T b) { return (a>b)?a:b; } int main() { int x=2,y=6; double x1=9.123,y1=12.6543; cout<<"把T实例化为int:"<<max(x,y)<<endl; cout<<"把T实例化为double:"<<max(x1,y1)<<endl; return 0; }
改法6:将max定义在自己的空间内
#include<iostream> using namespace std; namespace m //将max定义在m空间里 { //定义函数模板 template<class T> T max(T a, T b) { return (a>b)?a:b; } } int main() { int x=2,y=6; double x1=9.123,y1=12.6543; cout<<"把T实例化为int:"<<m::max(x,y)<<endl; //使用自己m空间内的max函数 cout<<"把T实例化为double:"<<m::max(x1,y1)<<endl; return 0; }