在下面的CPP代码中,isGreater()
函数对整数执行正确的工作。但是,它不能为字符串产生正确的结果。我最初的猜测是,由于尚未使用std:: string ::compare()
方法,因此我为字符串创建了专门的isGreater()
模板方法,而第一个cout
仍将输出为1。我认为它必须进行比较按字母顺序排列的字符串。但是,我不这么认为。第二个和第三个cout
语句提供正确的输出,即比较中的整数和字母顺序的字符串。 isGreater()
中字符串的确切含义是什么?
#include <iostream>
#include <string>
using namespace std;
template <typename T>
bool isGreater(T x1, T x2)
{
return (x1 > x2);
}
template <>
bool isGreater(string x1, string x2)
{
return (x1.compare(x2));
}
int main()
{
cout << isGreater("AAAA", "ZZZZ") << endl; //First cout
cout << isGreater(5, 10) << endl; //Second cout
string str1 = "AAA";
string str2 = "ZZZZZ";
cout << str1.compare(str2) << endl; //Third cout
return 0;
}
答案 0 :(得分:4)
问题在于isGreater("AAAA", "ZZZZ")
没有调用您的std::string
专长。它使用 pointers (const char*
)调用常规的模板化函数,然后比较这些指针而不是字符串。
如果要使用文字字符串,则需要添加使用指针参数的特殊化(或重载)。
对于std::string
专业化而言,std::string::compare
函数并不return您认为的那样。
如果字符串不相等,则返回“ true”(非零)值,如果x1
为,则可能为负(因为非零将为true)。小于x2
。请使用大于运算符的标准值(overloaded),或者检查返回的值是否大于零:
return x1.compare(x2) > 0;
答案 1 :(得分:1)
如其他答案所示,您不调用std :: string专用化,因为您没有std::string
,而您拥有const char []
。
最好的解决方案是确保模板化方法不会取代专业化。从C ++ 17开始,我将使用if constexpr
,在C ++ 11和C ++ 14中,我将使用std::enable_if
。 (请注意,我使用string_view来防止内存分配。)
template <typename T>
bool isGreater(T x1, T x2)
{
if constexpr (std::is_convertable_v<T, std::string_view>)
std::string_view{x1}.compare(x2);
else
return (x1 > x2);
}
旧标准
template <typename T, typename = std::enable_if<!std::is_convertable<T, std::string>::value>::type>
bool isGreater(T x1, T x2)
{
return (x1 > x2);
}
bool isGreater(string x1, string x2)
{
return (x1.compare(x2));
}
答案 2 :(得分:0)
#include <iostream>
#include <string>
using namespace std;
template <typename T>
bool isGreater(T x1, T x2)
{
return (x1 > x2);
}
bool isGreater(string x1, string x2)
{
return (x1.compare(x2));
}
int main()
{
cout << isGreater(string("AAAA"), string("ZZZZ")) << endl;
cout << isGreater(5, 10) << endl;
string str1 = "AAAA";
string str2 = "ZZZZ";
cout << str1.compare(str2) << endl;
return 0;
}
您需要输入类型转换,否则它正在调用模板