我正在使用我在网上找到的模板函数,它用于返回C ++中数组的长度。我发现,如果我直接调用该方法,但是当我通过另一种方法调用它时,我会收到错误no instance of function template "array_size" matches the argument list
。
我显然误解了如何通过方法传递数组,但我很难理解为什么这不起作用。
template<size_t SIZE, class T> inline size_t array_size(T(&arr)[SIZE]) {
return SIZE;
}
int wordLength(char* word) {
return array_size(word) - 1; // Gets argument error
}
void fooBar() {
int n = array_size("Hello"); // Works!
int m = wordLength("Hello"); // What I want }
我对此缺少哪些细节以及如何解决此问题,以便我可以致电wordLength
答案 0 :(得分:5)
您误解了array_size
的工作原理。它从类型本身检索数组长度信息,因此在array_size("Hello")
的情况下,文字"Hello"
的类型实际上是const char[6]
。但是当您使用函数wordLength
时,您正在从类型中删除长度信息,它只变为char*
。
修复代码的直接方法是使wordLength
成为模板:
template <typename T, size_t N>
int wordLength(T (&word)[N]) {
return array_size(word) - 1;
}
但是,我建议你不要这样做。如果你想使用字符串,更好的方法是切换到std::string
类型;如果你想使用堆栈分配的固定大小数组,到std::array
;或者std::vector
如果你想使用动态数组。除了使用外部API时,C ++中的C风格数组几乎没有用例,所以我建议你不要在代码中使用它们。