【发布时间】:2020-05-22 17:51:41
【问题描述】:
我正在编写一个模板函数来打印出 c 样式数组的第一个元素。如果有两个模板参数,则该函数可以工作,但如果只有一个参数,则该函数会失败。
以下代码有效。该函数正确计算 c 样式数组的大小。
template<typename dummy, typename T>
void printfunc(const T &c){
std::cout << sizeof(c)/sizeof(c[0]) << std::endl; //prints 5 as desired
}
int main() {
int arr[] = {1,2,3,4,5};
printfunc<int>(arr);
return 0;
}
下面的代码没有。使用 g++2a 编译器出现编译错误
template<typename T>
void printfunc(const T &c){
std::cout << sizeof(c)/sizeof(c[0]); //Compile Error
}
int main() {
int arr[] = {1,2,3,4,5};
printfunc<int>(arr);
return 0;
}
更令人困惑的是,我使用template<typename T> 得到的编译错误与我执行以下操作时不同:
void printfunc(const int &c){
std::cout << sizeof(c)/sizeof(c[0]); //compile error
}
int main() {
int arr[] = {1,2,3,4,5};
printfunc(arr);
return 0;
}
我只是用调用int的函数替换了template,应该是等价的,但是编译器报错不一样。
发生了什么事?
【问题讨论】:
-
printfunc<int>(arr);想要一个int但你传递了一个数组。 -
Stack Overflow 的惯例是您不根据答案更改您的问题。问题的内容应保持已回答的内容,以便答案继续有意义。 (澄清编辑是可以的,但删除您询问的错误是不行的。)当您的问题得到您满意的回答时,您应该接受最佳答案并且不将“已回答”编辑到您的主题中。存在已接受的答案表示该问题已得到回答。