对“SDL_UpperBlit”的调用没有匹配的函数

Posted

技术标签:

【中文标题】对“SDL_UpperBlit”的调用没有匹配的函数【英文标题】:No matching function for call to 'SDL_UpperBlit' 【发布时间】:2019-01-09 03:05:09 【问题描述】:

我对 c++ 比较陌生,所以尽管我有其他 c 语言的经验,但这可能只是一个简单的错误。这是我的代码:

#include <iostream>
#include <SDL2/SDL.h>

SDL_Window *window;
SDL_Surface *windowSurface;
SDL_Surface *image[3];
SDL_Surface *currentImage;
int close();
SDL_Rect gRect(int, int, int, int); //for method described below

int main(int argc, char *argv[])

    SDL_Init(SDL_INIT_VIDEO);
    window = SDL_CreateWindow("Test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 500, 500, SDL_WINDOW_SHOWN);
    windowSurface = SDL_GetWindowSurface(window);
    image[0] = SDL_LoadBMP("filepath/img.bmp");
    image[1] = SDL_LoadBMP("filepath/img2.bmp");
    image[2] = SDL_LoadBMP("filepath/img3.bmp");
    currentImage = image[0];


    bool done = false;
    while(!done)
        SDL_Rect rec;
        rec.x = 100;
        rec.y = 100;
        rec.h = 100;
        rec.w = 100;
        SDL_BlitSurface(currentImage, NULL, windowSurface, rec);
        SDL_UpdateWindowSurface(window);
    
    return close();

int close()
    for(int i = 0; i < 3; i++)
        SDL_FreeSurface(image[i]);
        image[i] = nullptr;
    
    currentImage = nullptr;
    window = nullptr;
    SDL_DestroyWindow(window);
    SDL_Quit();
    return 0;

运行此程序时,我收到错误“没有调用“SDL_UpperBlit”的匹配函数”。显然,这已被我在程序中使用的 SDL_BlitSurface 取代。

如果我将函数调用中的“rec”替换为“NULL”,则不会出现此错误,并且我的程序可以正常编译,并且图像会填满屏幕。

我尝试使用一个函数来创建一个 SDL_Rect,如下所示:

SDL_Rect gRect(int x, int y, int w, int h)
    SDL_Rect ret;
    ret.h = h;
    ret.w = w;
    ret.x = x;
    ret.y = y;
    return ret;

并将 SDL_BlitSurface 调用更改为

SDL_BlitSurface(currentImage, NULL, windowSurface, gRect(100, 100, 100, 100));

这并不能解决问题,并且会出现相同的错误。如果我能得到任何帮助,将不胜感激!谢谢!

(可选)PS:我也希望能在将“image[0]”、“image[1]”和“image[2]”声明放入 for 循环中提供帮助。我试过了,但在类型和连接方面遇到了一些问题,所以如果有人知道我该怎么做,请告诉我。

【问题讨论】:

【参考方案1】:

SDL_BlitSurface函数声明是

int SDL_BlitSurface(SDL_Surface*    src,
                    const SDL_Rect* srcrect,
                    SDL_Surface*    dst,
                    SDL_Rect*       dstrect)

你的代码片段

    SDL_Rect rec;
    rec.x = 100;
    rec.y = 100;
    rec.h = 100;
    rec.w = 100;
    SDL_BlitSurface(currentImage, NULL, windowSurface, rec);

rec 作为最后一个参数传递,其类型为SDL_Rect,但应为SDL_Rect*。它应该是例如SDL_BlitSurface(currentImage, NULL, windowSurface, &amp;rec);

我还建议不要将 close 用作函数名称,因为它是 known to cause 问题(对于 C++ 来说,它的名称不正确,但仍然如此)。

【讨论】:

谢谢,这很有帮助!

以上是关于对“SDL_UpperBlit”的调用没有匹配的函数的主要内容,如果未能解决你的问题,请参考以下文章

符号不匹配,ida/windbg

在 Swift 中调用实例方法错误消息没有完全匹配

ORACLE有没有判断一个字串里面包含令一个字串的函式

在类中引用函数时出现“调用没有匹配函数”

调用 basic_string::copy 没有匹配的函数

Qt插槽和信号:MainWindow中没有匹配的功能