2014-03-26 83 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

相關問題