为什么在cpp中与'World'比较时打印出'Hello'?
why is 'Hello' being printed out when it is compared with 'World' in cpp?
我正在尝试 CPP 中的模板。当我将它与 'World'?
进行比较时,我不明白为什么要打印 'Hello'
下面是我的代码片段 ->
#include <iostream>
using std::cout;
using std::endl;
template <typename T>
T max(T a, T b){
if(a > b){
return a;
}
else{return b;}
}
int main() {
cout << "max(3, 5): " << max(3, 5) << endl;
cout << "max('a', 'd'): " << max('a', 'd') << endl;
cout << "max(\"Hello\", \"World\"): " << max("Hello", "World") << endl;
return 0;
}
输出
ec2-user:~/environment/cpp_learn/uiuc_cpp/cpp-templates (master) $ make
g++ -std=c++14 -O0 -pedantic -Wall -Wfatal-errors -Wextra -MMD -MP -g -c main.cpp -o .objs/main.o
g++ .objs/main.o -std=c++14 -o main
ec2-user:~/environment/cpp_learn/uiuc_cpp/cpp-templates (master) $ ./main
max(3, 5): 5
max('a', 'd'): d
max("Hello", "World"): Hello
这是我使用的 C++ 版本 ->
ec2-user:~/environment/cpp_learn/uiuc_cpp/cpp-templates (master) $ c++ --version
c++ (GCC) 7.2.1 20170915 (Red Hat 7.2.1-2)
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
在此先感谢您的帮助。如果答案太明显,我深表歉意。
"Hello"
和 "World"
都是 C 风格的字符串(类型为 const char[6]
),当传递给 max
时,它们会衰减为 const char*
, T
也被推断为 const char*
。所以比较只是比较指针,即内存地址,结果是 unspecified.
您可以使用 strcmp
添加重载或模板特化来比较 C 风格的字符串,或者使用 std::string
,
my_max(std::string("Hello"), std::string("World")) // name changed because of the conflict with std::max
相反,您可以使用两个模板 T
和 P
。
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;
template <typename T,typename P>
T max(T a, P b){
if(a > b){
return a;
}
else{return b;}
}
int main() {
cout << "max(3, 5): " << max(3, 5) << endl;
cout << "max('a', 'd'): " << max('a', 'd') << endl;
cout << "max(\"Hello\", \"World\"): " << max(string("Hello"),string("World")) << endl;
return 0;
}
编译这个修改后的版本。
此代码不言自明。
我正在尝试 CPP 中的模板。当我将它与 'World'?
进行比较时,我不明白为什么要打印 'Hello'下面是我的代码片段 ->
#include <iostream>
using std::cout;
using std::endl;
template <typename T>
T max(T a, T b){
if(a > b){
return a;
}
else{return b;}
}
int main() {
cout << "max(3, 5): " << max(3, 5) << endl;
cout << "max('a', 'd'): " << max('a', 'd') << endl;
cout << "max(\"Hello\", \"World\"): " << max("Hello", "World") << endl;
return 0;
}
输出
ec2-user:~/environment/cpp_learn/uiuc_cpp/cpp-templates (master) $ make
g++ -std=c++14 -O0 -pedantic -Wall -Wfatal-errors -Wextra -MMD -MP -g -c main.cpp -o .objs/main.o
g++ .objs/main.o -std=c++14 -o main
ec2-user:~/environment/cpp_learn/uiuc_cpp/cpp-templates (master) $ ./main
max(3, 5): 5
max('a', 'd'): d
max("Hello", "World"): Hello
这是我使用的 C++ 版本 ->
ec2-user:~/environment/cpp_learn/uiuc_cpp/cpp-templates (master) $ c++ --version
c++ (GCC) 7.2.1 20170915 (Red Hat 7.2.1-2)
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
在此先感谢您的帮助。如果答案太明显,我深表歉意。
"Hello"
和 "World"
都是 C 风格的字符串(类型为 const char[6]
),当传递给 max
时,它们会衰减为 const char*
, T
也被推断为 const char*
。所以比较只是比较指针,即内存地址,结果是 unspecified.
您可以使用 strcmp
添加重载或模板特化来比较 C 风格的字符串,或者使用 std::string
,
my_max(std::string("Hello"), std::string("World")) // name changed because of the conflict with std::max
相反,您可以使用两个模板 T
和 P
。
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;
template <typename T,typename P>
T max(T a, P b){
if(a > b){
return a;
}
else{return b;}
}
int main() {
cout << "max(3, 5): " << max(3, 5) << endl;
cout << "max('a', 'd'): " << max('a', 'd') << endl;
cout << "max(\"Hello\", \"World\"): " << max(string("Hello"),string("World")) << endl;
return 0;
}
编译这个修改后的版本。 此代码不言自明。