2014-03-26 82 views
0

我在标题中出现错误。它指向了for循环声明的那一行。关于发生什么的任何想法?从'char *'无效转换为'char'

#include <iostream> 

template <typename T> 
T max(T* arr, size_t n) 
{ 
    if (!n) 
     throw("Can't take the max of an empty array, bro."); 
    T top = arr[0]; 
    for (T* i(arr+1), j(arr+n); i != j; ++i) 
     if (*i > top) 
      top = *i; 
    return top; 

} 

int main() 
{ 

    char S[] = "kjadkjhdjasjkdaskjdsahd"; 
    std::cout << max(S, strlen(S)); 

    return 0; 
} 
+1

FWIW,这可以用'std :: max_element'替换(并且用'std :: string'更好),并且缺少'strlen'的头文件。 – chris

+0

这没什么好玩的,虽然 – user3461018

回答

6

在行:

for (T* i(arr+1), j(arr+n); i != j; ++i) 

只有我被声明为指针,T,j被声明为T的情况下正确的声明是:

for (T* i(arr+1),* j(arr+n); i != j; ++i) 

而且顺便说一句,你应该添加包括strlen:

#include <cstring> 
+0

我一直讨厌在这方面C/​​C++中的指针声明是如何工作的。在我看来,'*'与类型,而不是变量名称,我希望*,例如,'char *我,j;'意味着'我'和'j'是两个变量的类型'字符*'。我不知道这是否仅仅是原始C语言的一个不幸的遗迹,或者它是否因为正好超出了我的理由而被保留下来。但无论如何,它看起来不会很快改变。 –

+0

@MikeHolt声明中的星号与变量绑定,而不是类型。你是对的,从C语言时代开始就一直如此,C++标准委员会对维护向后兼容性非常严格,所以恐怕它会一直保持到大决战为止。 在我看来,它并不是那么重要 - 任何好的书都会提到C/C++声明语法的这个特性,还有很多其他的东西更令人讨厌...... – mcopik

+0

是的,我知道它是如何的,我是只是感叹这一事实,并不是暗示星号实际上是与这种类型绑定的。 –

1

这是多个以逗号分隔的指针变量声明的常见错误。更改您的for循环标题如下:

for (T *i(arr+1), *j(arr+n); i != j; ++i) { 
       //^Note the additional asterisk! 
} 

请参阅固定和工作sample here

相关问题