2014-04-01 2 views
3

필자는 함수를 호출하고 포인터에 의한 변수와 값에 의한 변수를 제공한다고 생각되는 몇 가지 오류가 있습니다. 그러나, 어떻게 든 포인터 변수에 의한 호출이 포인터를 참조하도록 변경되었으므로 컴파일러 오류가 발생합니다.포인터에 의한 호출 포인터에 대한 참조에 의한 호출

SDL_Renderer *renderer = SDL_CreateRenderer(win, -1, 
    SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); 
SDL_Texture* background = loadTexture("./background.bmp", renderer); 
SDL_Texture* image = loadTexture("./image.bmp", renderer); 
... 
int bW, bH; 
SDL_QueryTexture(background, NULL, NULL, &bW, &bH); 
renderTexture(background, renderer, 0, 0); 
renderTexture(background, renderer, bW, 0); 

그래서, 궁금하네요, 왜 모호한 호출입니다 :

다음은 오류

g++ -Wall -c -std=c++11 -I. -c -o SDL_Lesson2.o SDL_Lesson2.cpp 
SDL_Lesson2.cpp: In function ‘int main(int, char**)’: 
SDL_Lesson2.cpp:56:42: error: call of overloaded ‘renderTexture(SDL_Texture*&,  
SDL_Renderer*&, int, int)’ is ambiguous 
SDL_Lesson2.cpp:56:42: note: candidates are: 
In file included from SDL_Lesson2.cpp:8:0: 
sdlWrapper.hpp:40:6: note: void renderTexture(SDL_Texture*, SDL_Renderer*, int, int) 
sdlWrapper.hpp:54:6: note: void renderTexture(SDL_Texture*, SDL_Renderer*, int, int,  
SDL_Rect*) 
SDL_Lesson2.cpp:57:43: error: call of overloaded ‘renderTexture(SDL_Texture*&,  
SDL_Renderer*&, int&, int)’ is ambiguous 
SDL_Lesson2.cpp:57:43: note: candidates are: 
In file included from SDL_Lesson2.cpp:8:0: 
sdlWrapper.hpp:40:6: note: void renderTexture(SDL_Texture*, SDL_Renderer*, int, int) 
sdlWrapper.hpp:54:6: note: void renderTexture(SDL_Texture*, SDL_Renderer*, int, int,  
SDL_Rect*) 

이 라인에 인 코드입니다. 내 마음 속에서 renderTexture(background, renderer, 0, 0)은 분명히 renderTexture(SDL_Texture*, SDL_Renderer*, int, int)입니다. 나는 틀렸다. 그러나 나는 이유를 이해할 수 없다.

또한 두 줄 사이의 첫 번째 int은 값별로 호출에서 참조로 호출하도록 변경됩니다. 그것은 또한 나에게 신비입니다.

문제는 두 가지 오버로드 된 버전에서 발생한다고 생각합니다.

void renderTexture(SDL_Texture *tex, SDL_Renderer *ren, int x, int y, int w, int h); 

void renderTexture(SDL_Texture *tex, SDL_Renderer *ren, SDL_Rect dst, 
SDL_Rect *clip = nullptr); 

이 버전은, 나 같은 보이지 않습니다. 하지만 SDL_Rect는 구조체에서 4 개의 정수이므로 컴파일러가 서로 어떻게 혼동 하는지를 알 수 있습니다.

이 기능들 중 하나만 remoce해야합니까? 아니면 다른 곳에 문제가 있습니까? 그 중 하나를 제거하여 문제를 숨길 수 있습니까?

+0

'clang ++'으로 컴파일을 시도하십시오. 그것은'g ++ '와 같은 인자를 취하지 만 에러 메시지는 종종 더 유용합니다. –

+0

표시 한 프로토 타입이 정확한지 확실하지 않습니다. 오류 메시지에 표시되는 프로토 타입으로 판단하고 자신의 것으로 추측하면 기본 매개 변수가 지정되지 않은 경우 renderTexture에 문제가 있다는 것을 알 수 있습니다. 기본 매개 변수를 지정하지 않으면 다른 버전과 혼동됩니다. – jsantander

+0

'C++ '래퍼를 사용하는 대신 맨손의'C' 라이브러리로 작업 할 것을 권장합니다. 커스텀'Deleter's와 함께'std :: unique_ptr'을 사용하여'C' 포인터를 '객체화'할 수 있습니다. –

답변

1

두 번째 질문과 관련하여 두 번째 호출은 &으로 등록됩니다. 그 이유는 두 번째 호출에 해당 서명을 수행 할 수있는 옵션이 있기 때문입니다. 리터럴은 값으로 전달 될 수 있지만 변수는 참조 또는 값으로 전달 될 수 있습니다. 따라서 0int을 사용하는 서명과 일치 할 수 있지만 bWint 또는 int&을 취하는 서명과 일치 할 수 있습니다.

첫 번째 질문에 대해서는 두 줄을 sdlWrapper.hpp에서 정확하게 복사 했습니까? 후보 서명이 귀하가 제공 한 서명과 일치하지 않는 것처럼 보입니다.