2013-11-03 4 views
0

이 질문에 대해서는 이미 조사해 보았습니다.하지만 내 오류를 다루는 모든 질문은 클래스 및 기본 생성자와 관련이 있지만 내 코드에는 클래스가 들어있는 것처럼 보입니다. 그것은 주어진 배열의 원소의 수를 반환하는 간단한 size() 함수입니다. (나는 size() 함수가 내장되어 있다는 것을 알고있다.)술어 템플릿 함수로 여기에서 오류가 발생했습니다

처음에는 size() 함수가 이미 존재하여 size 함수가 이미 존재할 때 내 함수 이름 size()에 화가났다 고 생각했기 때문에 sise()로 변경했지만 여전히 같은 오류를 받았고 해결 방법을 모르고있었습니다. 그것.

코드 : 서로 각각의 통화 기능을 주석 처리되었지만

Shakersort.cpp: In function ‘int sise(T*, int) [with T = int]’: 
Shakersort.cpp:60:24: instantiated from ‘int sise(T*) [with T = int]’ 
Shakersort.cpp:77:28: instantiated from here 
Shakersort.cpp:51:3: warning: NULL used in arithmetic [-Wpointer-arith] 

의 같은 오류가 그대로 주석 기능에 대해 걱정하지 마십시오

template<class T > int sise(T array[], int count){ 
    if(array[count+1]== NULL){ 
    return count+1; 
    } 
    else{ 
    return sise(array,count+1); 
    } 
} 

template <class T> int sise(T array[]){ 
    return sise(array , 0); 
    } 

int main(){ 
    int array[] = {1 , 7 , 5, 4, 6 ,2 , 3}; 
    int len = sise<int>(array); 
    std::cout << len << std::endl; 
    //print<int>(array); 
    // shakersort<int>(array); 
    // print<int>(array); 

    return 0; 
} 

가) (주에서 호출 주어진. 무슨 일 이니?

+0

) int 배열 []이 null로 끝나지 않으므로 크기 계산이 수행되지 않습니다. 컴파일 할 때에도 작동합니다. NULL은 포인터로 정의되고 int와 비교됩니다. –

답변

2

NULL에 대한 컴파일러의 경고 메시지는 int과 비슷합니다. 엄격한 오류가 아니며 (오류도 아니지만) 잘못된 가정에 대한 가능한 표시입니다. 그러한 가정 중 하나는 배열이 마술처럼 null로 종료된다는 것입니다 : 그렇지 않습니다. 이것은 문자열 리터럴에 매우 특정한 것이고 null 종료자는 NULL이 아니라 '\0'입니다. 배열의 크기를 전달해야하거나 템플릿을 사용하여 추론해야합니다 (예 :

template <typename T, int Size> 
int sise(T (&array)[Size], int count) { 
    ... 
} 
+0

'sise' 함수가 로직의 이유로 두 번째 매개 변수를 가져야한다고 생각하지 않습니다. 그리고 OP가'main'에서 어떻게 호출 할지를 기준으로합니다. – NicholasM

+0

@NicholasM : 그럴 수도 있습니다. 방금 배열의 크기 추론을 추가하여 원래 선언문에서와 동일한 매개 변수 세트를 사용했습니다. 나는'count'가 정렬이나 무언가에 대해 고려 된 현재 위치를 나타내는 데 사용될 것이라고 추정했습니다. 필자의 주요 요점은 경고를 언급하고 배열 크기가 어딘가에서 올 필요가 있음을 언급하는 것이 었습니다. 나는 논리를 바로 잡으려 고 시도하지 않았다. –

관련 문제