我正在使用我在网上找到的模板函数,它用于返回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
你误解了它是如何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风格数组几乎没有用例,因此我建议您避免在代码中使用它们.
| 归档时间: |
|
| 查看次数: |
83 次 |
| 最近记录: |