为什么我不能将字符串文字传递给此模板?

Why I can't pass string literal to this template?

这是模板

template <int LEN_1, int LEN_2>
bool less (char const (*arr1)[LEN_1], char const (*arr2)[LEN_2]) {
    for (int i=0; i<LEN_1 && i<LEN_2; ++i) {
        if (arr1[i]<arr2[i]) return true;
        if (arr1[i]>arr2[i]) return false;
    }
    return LEN_1 < LEN_2;
}

我正在尝试将字符串文字作为其参数从 main 传递,例如:

std::string a = "hello";
std::string b = "ok";

::less(a, b);

据我所知,如果我按值传递 args,字符串文字应该衰减为 char const*。但是就是编译不通过

请帮我打破这个鸡蛋。

这不是合法的 C++。如果您希望数组衰减,则必须显式传递大小。这是它的语法:

bool less (char const *arr1, std::size_t LEN_1, char const *arr2, std::size_t LEN_2) {
    for (std::size_t i=0; i<LEN_1 && i<LEN_2; ++i) {
        if (arr1[i]<arr2[i]) return true;
        if (arr1[i]>arr2[i]) return false;
    }
    return LEN_1 < LEN_2;
}

但您似乎想通过引用传递数组。操作方法如下:

template <std::size_t LEN_1, std::size_t LEN_2>
bool less (char const (&arr1)[LEN_1], char const (&arr2)[LEN_2]) {
    for (std::size_t i=0; i<LEN_1 && i<LEN_2; ++i) {
        if (arr1[i]<arr2[i]) return true;
        if (arr1[i]>arr2[i]) return false;
    }
    return LEN_1 < LEN_2;
}

注意使用 std::size_t 而不是 int

或者,您可以使用空终止符代替大小:

bool less (char const arr1[], char const arr2[]) {
    for (/*nothing*/;*arr1 && *arr2; ++arr1, ++arr2) {
        if (*arr1 < *arr2) return true;
        if (*arr1 > *arr2) return false;
    }
    return !*arr1;
}

但是,在您的示例中,您传递的是 std::string 的实例,而不是 char 数组。在这种情况下,您不需要自定义函数。重载 operator< 做你想做的事。如果你真的想使用你的功能,请使用 std::string::c_str:

less(a.c_str(), b.c_str());

或者你可以直接传递文字:

less("hello", "ok");