2016-01-18 190 views
1

我想看看直接使用像<,>等運算符比較字符串會發生什麼情況。下面的代碼中的兩種用法令人驚訝地給出了不同的答案。他們是不是完全一樣的說話方式?使用通用比較器進行字符串比較

#include <iostream> 

template <class T> 
T max(T a, T b) 
{  
    //Usage 1: 
    if (a > b) return a; else return b; 

    //Usage 2: 
    return a > b ? a : b ; 
} 

int main() 
{ 
    std::cout << "max(\"Alladin\", \"Jasmine\") = " << max("Alladin", "Jasmine") << std::endl ; 
} 

用法1給出「茉莉花」,而用法2給出「阿拉丁」。

+2

使用g ++,兩種情況都給我「Alladin」。 – pushkin

+0

你是如何編譯它的? – pushkin

+0

它看起來像一個編譯器問題。我正在使用http://cpp.sh/進行編譯。當我使用g ++時,它在兩種情況下都會給出「Alladin」。 –

回答

4

當你使用:

max("Alladin", "Jasmine") 

它等同於使用:

max<char const*>("Alladin", "Jasmine") 

在功能上,你最終比較指針。調用的結果將取決於指針的值。不保證是可預測的。

也許你想使用:

max(std::string("Alladin"), std::string("Jasmine")) 

max<std::string>("Alladin", "Jasmine") 

但是要注意,當您使用一些編譯器可能會拿起std::max。您可能需要將max更改爲my_max或類似的東西。

+0

您的第一個類型轉換兩個std :: string都不起作用。錯誤:15:104:錯誤:重載'max(std :: string,std :: string)'的調用不明確。第二個建議工作得很好。 –

+1

您是否嘗試過使用'my_max'? –

+1

FWIW,它使用g ++爲我工作。看到它在http://ideone.com/s87imF工作。 –

3

這兩種方法都是錯誤的。字符串沒有有效的>運算符。

您可以比較std::string代替:

#include <iostream> 
#include <string> 

template <class T> 
T my_max(T a, T b) 
{ 
    return a > b ? a : b; 
} 

int main() 
{ 
    std::string a = "Alladin"; 
    std::string b = "Jasmine"; 
    std::cout << "my max: " << my_max(a, b) << std::endl; 

    //standard max function: 
    std::cout << "standard max: " << max(a, b) << std::endl; 
} 

預期的結果應該永遠是「茉莉花」

+0

我試過你的建議。錯誤:重載'max(std :: string&,std :: string&)'的調用不明確 –

+1

我發現它與@RSahu指出的問題相同,模板函數必須更改爲'my_max' –

3

你實際上並沒有比較你的串碼。 "Alladin""Jasmine"實際上是const char[]類型,當您撥打max("Alladin", "Jasmine")時,它們會衰減爲指針。這意味着在你的函數中你要比較字符串的地址而不是內容。

如果您打算測試std::string s,那麼您需要創建std::string s並將它們傳遞給您的max函數。