无法从辅助函数调用模板函数

时间:2017-12-10 20:35:52

标签: c++

我正在使用我在网上找到的模板函数,它用于返回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

1 个答案:

答案 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风格数组几乎没有用例,所以我建议你不要在代码中使用它们。