模板有关问题?编译器有关问题

模板问题?编译器问题?
我在看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]