2010-04-07 6 views
4

이 코드가 발견되어 오버로드가 발생하는지 여부가 확실하지 않습니다.함수 오버로드

내가 4 개 요소의 배열에 대한 포인터를 전달하는 경우가 와야한다에, 무슨 일
void print(int (*arr)[6], int size); 

void print(int (*arr)[5], int size); 

...

임의의 스레드에 도움이 될 것입니다.

답변

6

KennyTM's answer이 정확한 것입니다. 하지만 추가 질문은 C++ 태그와 함께 제공된다는 사실을 기반으로합니다.

#include <iostream> 

template< std::size_t N > 
void print(int (&arr)[N]) {std::cout << N << '\n';} 

int main() 
{ 
    int arr[6]; 
    print(arr); 
    return 0; 
} 
+1

아니요,'int (* x) [n]'은'int [n]'에 대한 포인터입니다. – kennytm

+0

당신 말이 맞아요. 나는'*'을 간과했다. 나는 더 많은 관심을 기울여야한다. – sbi

10

과부하가 일어날 것이고, 두 기능이 일치하지 않습니다 4 int 년대의 배열에 포인터를 전달 : C++에서는 배열의 차원을 알아 않은 형태 인수를 가지는 템플릿을 사용할 수 있습니다.

void print(int arr[][6], int size); 
void print(int arr[][5], int size); 

는 N × 4 배열이 4 int 년대의 배열에 대한 포인터로 부패 할 수 있습니다 : 당신이 동등한 형태로 쓰기 경우는 명확합니다. 그리고 2 차원이 다른 2D 배열은 호환되지 않는 것으로 잘 알려져 있습니다.

1

두 오버로드 중 어느 것도 int (*arr)[4]으로 변환 할 수 없으므로 호출이 모호합니다. 명시 적으로 5 또는 6 요소의 요소를 전달해야합니다.

VS2008을 제공합니다 도움이

error C2665: 'print' : none of the 2 overloads could convert all the argument types 
(2088): could be 'void print(int (*)[5],int)' 
(2093): or  'void print(int (*)[6],int)' 
while trying to match the argument list '(int (*)[4], int)' 

희망을.