模板有关问题?编译器有关问题
模板问题?编译器问题?
我在看C++ Primer第四版第16.1节的时候,书上有个例子:
函数模板:
函数调用:
我将上面的代码进行了改写:
上面这段代码,在VS2008下面,运行结果是:
String 1 : A
String 2 : a
A > a
A > a
请按任意键继续. . .
在Debian6.0的g++ (Debian 4.4.5-8) 4.4.5环境下编译执行结果是:
String 1 : A
String 2 : a
A < a
A < a
在VS2008下面,注释掉main函数中的
结果就正确了:
A < a
A < a
请按任意键继续. . .
切换到Debian下面,如果同样注释掉main函数中的这两行,结果就出问题了:
A > a
A > a
在Debian下面,所有编译均采用
g++ strTemp.cpp -o strTemp -Wall -O0命令编译。
不知道这个问题是什么原因,是编译器的原因还是模板的使用问题?
------解决方案--------------------
两个字符串的比较,比较的是他们的地址。对于你的两个字符串常量"A"和"a"来说,他们的地址哪个在前哪个在后要看编译器了。
------解决方案--------------------
传递过去的是数组的引用。比较的是数组的地址
在myCompare里面加上
输出T的 类型就知道为啥了
------解决方案--------------------
比地址呢。。
------解决方案--------------------
"A"以及"B"的类型是const char[2]
我在看C++ Primer第四版第16.1节的时候,书上有个例子:
函数模板:
// implement strcmp-like generic compare function
// returns 0 if the values are equal, 1 if v1 is larger, -1 if v1 is smaller
template <typename T>
int compare(const T &v1, const T &v2)
{
if (v1 < v2) return -1;
if (v2 < v1) return 1;
return 0;
}
函数调用:
int main ()
{
// T is int;
// compiler instantiates int compare(const int&, const int&)
cout << compare(1, 0) << endl;
// T is string;
// compiler instantiates int compare(const string&, const string&)
string s1 = "hi", s2 = "world";
cout << compare(s1, s2) << endl;
return 0;
}
我将上面的代码进行了改写:
#include <iostream>
#include <string>
using namespace std;
template<class T>
int myCompare(const T &v1, const T &v2){
cout<<v1<<" "<<((v1>v2)?(">"):((v1<v2)?("<"):("=")))<<" "<<v2<<endl;
return (v1>v2)?(1):((v1<v2)?(-1):0);
};
int main(void){
int iRes;
cout<<"String 1 : "<<"A"<<endl;
cout<<"String 2 : "<<"a"<<endl;
iRes=myCompare("A", "a");
cout<<"A "<<((iRes==1)?(">"):((iRes==(-1))?("<"):("=")))<<" a"<<endl;
return 0;
};
上面这段代码,在VS2008下面,运行结果是:
String 1 : A
String 2 : a
A > a
A > a
请按任意键继续. . .
在Debian6.0的g++ (Debian 4.4.5-8) 4.4.5环境下编译执行结果是:
String 1 : A
String 2 : a
A < a
A < a
在VS2008下面,注释掉main函数中的
cout<<"String 1 : "<<"A"<<endl;
cout<<"String 2 : "<<"a"<<endl;
结果就正确了:
A < a
A < a
请按任意键继续. . .
切换到Debian下面,如果同样注释掉main函数中的这两行,结果就出问题了:
A > a
A > a
在Debian下面,所有编译均采用
g++ strTemp.cpp -o strTemp -Wall -O0命令编译。
不知道这个问题是什么原因,是编译器的原因还是模板的使用问题?
------解决方案--------------------
两个字符串的比较,比较的是他们的地址。对于你的两个字符串常量"A"和"a"来说,他们的地址哪个在前哪个在后要看编译器了。
------解决方案--------------------
传递过去的是数组的引用。比较的是数组的地址
在myCompare里面加上
cout<<typeid(T).name() <<endl;
输出T的 类型就知道为啥了
------解决方案--------------------
比地址呢。。
------解决方案--------------------
"A"以及"B"的类型是const char[2]