字符串比较中的意外输出

时间:2020-02-03 07:09:39

标签: c++ string templates

在下面的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;
}

3 个答案:

答案 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;
}

您需要输入类型转换,否则它正在调用模板

相关问题