为什么我不能将字符串文字传递给此模板?
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");
这是模板
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");