필자는 함수를 호출하고 포인터에 의한 변수와 값에 의한 변수를 제공한다고 생각되는 몇 가지 오류가 있습니다. 그러나, 어떻게 든 포인터 변수에 의한 호출이 포인터를 참조하도록 변경되었으므로 컴파일러 오류가 발생합니다.포인터에 의한 호출 포인터에 대한 참조에 의한 호출
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해야합니까? 아니면 다른 곳에 문제가 있습니까? 그 중 하나를 제거하여 문제를 숨길 수 있습니까?
'clang ++'으로 컴파일을 시도하십시오. 그것은'g ++ '와 같은 인자를 취하지 만 에러 메시지는 종종 더 유용합니다. –
표시 한 프로토 타입이 정확한지 확실하지 않습니다. 오류 메시지에 표시되는 프로토 타입으로 판단하고 자신의 것으로 추측하면 기본 매개 변수가 지정되지 않은 경우 renderTexture에 문제가 있다는 것을 알 수 있습니다. 기본 매개 변수를 지정하지 않으면 다른 버전과 혼동됩니다. – jsantander
'C++ '래퍼를 사용하는 대신 맨손의'C' 라이브러리로 작업 할 것을 권장합니다. 커스텀'Deleter's와 함께'std :: unique_ptr'을 사용하여'C' 포인터를 '객체화'할 수 있습니다. –