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

Nic*_*ick 1 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    }
Run Code Online (Sandbox Code Playgroud)

我错过了哪些细节以及如何修复它以便我可以打电话 wordLength

D. *_*riy 5

你误解了它是如何array_size运作的.它从类型本身检索数组长度信息,因此实际上array_size("Hello")是文字类型的情况.但是当你使用你的函数时,你正在从类型中删除长度信息,它变得正常."Hello"const char[6]wordLengthchar*

修复代码的直接方法是制作wordLength模板:

template <typename T, size_t N>
int wordLength(T (&word)[N]) {
    return array_size(word) - 1;
}
Run Code Online (Sandbox Code Playgroud)

但是,我建议你不要这样做.std::string如果你想使用字符串,更好的方法是切换到类型; 对std::array,如果你想用栈上分配的固定大小的数组工作; 或者std::vector如果你想使用动态数组.除了使用外部API时,C++中的C风格数组几乎没有用例,因此我建议您避免在代码中使用它们.