C++ 使用通用比较器的字符串比较

C++ 使用通用比较器的字符串比较,c++,string,C++,String,我试图看看当我们直接使用诸如等运算符比较字符串时会发生什么。下面代码中的两种用法给出了令人惊讶的不同答案。他们说话的方式不是完全一样吗 #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(

我试图看看当我们直接使用诸如等运算符比较字符串时会发生什么。下面代码中的两种用法给出了令人惊讶的不同答案。他们说话的方式不是完全一样吗

#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 ;
}
#包括
模板
T最大值(T a,T b)
{    
//用法1:
如果(a>b)返回a,否则返回b;
//用法2:
返回a>b?a:b;
}
int main()
{

std::cout两种方法都是错误的。字符串没有有效的
运算符

您可以改为比较
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;
}
#包括
#包括
模板
T my_max(T a,T b)
{
返回a>b?a:b;
}
int main()
{
std::string a=“Alladin”;
std::string b=“Jasmine”;

std::cout两种方法都是错误的。字符串没有有效的
运算符

您可以改为比较
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;
}
#包括
#包括
模板
T my_max(T a,T b)
{
返回a>b?a:b;
}
int main()
{
std::string a=“Alladin”;
std::string b=“Jasmine”;

std::cout您实际上并不是在比较代码中的字符串。
“Alladin”
“Jasmine”
实际上属于
const char[]
类型,当您调用
max(“Alladin”,“Jasmine”)时,它们会衰减为指针
。这意味着您在函数中比较的是字符串的地址,而不是内容


如果您想测试
std::string
s,那么您需要创建
std::string
s并将它们传递给
max
函数。

您实际上并不是在比较代码中的字符串。
“Alladin”
“Jasmine”
实际上是
const char[]
当您调用
max(“Alladin”,“Jasmine”)
时,它们会衰减为指针。这意味着在函数中,您比较的是字符串的地址,而不是内容

如果要测试
std::string
s,则需要创建
std::string
s并将其传递给
max
函数。

当您使用:

max("Alladin", "Jasmine")
这相当于使用:

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

max(“阿拉丁”、“茉莉花”)
请注意,当您使用时,某些编译器可能会选择
std::max
。您可能希望将
max
更改为
my_max
或类似的内容。

当您使用:

max("Alladin", "Jasmine")
这相当于使用:

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

max(“阿拉丁”、“茉莉花”)


需要注意的是,某些编译器在使用时可能会选择
std::max
。您可能希望将
max
更改为
my_max
或类似的内容。

使用g++,这两种情况都会给我“Alladin”。您是如何编译的?这看起来像是编译器的问题。我使用的是。当我使用g++,它会给我“Alladin”在这两种情况下。使用g++,这两种情况下都会给我“Alladin”。您是如何编译的?这看起来像是编译器的问题。我是使用编译的。当我使用g++,这两种情况下都会给我“Alladin”。您第一次建议将这两种类型都转换为std::string的操作不起作用。错误:15:104:错误:调用重载的“max”(std::string,std::string)'是不明确的。第二个建议非常有效。与我的_max配合得很好。因为我没有使用名称空间std,我没想到它会选择std::max。谢谢!@SonuKMishra,ADL是罪魁祸首。在这里和web上查找依赖于参数的查找以了解为什么会发生这种情况。不需要
my_max
。不合格的名称
max
在多个作用域中查找,
::
::std:
(因为它是从
::
::std::string
)中使用的。如果不想进行查找,只需自己指定名称空间:
::max(“a”,“b”)
。您的第一个将这两种类型转换为std::string的建议无效。错误:15:104:错误:调用重载的“max”(std::string,std::string)'是不明确的。第二个建议非常有效。与我的_max配合得很好。因为我没有使用名称空间std,我没想到它会选择std::max。谢谢!@SonuKMishra,ADL是罪魁祸首。在这里和web上查找依赖于参数的查找以了解为什么会发生这种情况。不需要
my_max
。不合格的名称
max
在多个作用域中查找,
::
::std:
(因为它是从
::
::std::string
)使用的。如果您不想进行查找,只需自己指定名称空间:
::max(“a”,“b”)
。我尝试了您的建议。错误:调用重载的“max”(std::string&,std::string&)'是模糊的我看到这是@RSahu指出的相同问题,模板函数必须更改为
my_max
我尝试了你的建议。错误:调用重载的'max(std::string&,std::string&')是模糊的我看到这是@RSahu指出的相同问题,模板函数必须更改为
my_max