1. 程式人生 > >第十六周項目3:max帶來的沖突

第十六周項目3:max帶來的沖突

clu 文件 沖突 include 實例化 post 本地 日期 空間

問題及代碼:

/*
*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; }





第十六周項目3:max帶來的沖突