2016-01-18 113 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函数。