模板功能错误,“没有匹配函数来调用...”

时间:2012-01-24 05:25:13

标签: c++ templates c++11

请参阅,我有这段代码:

template<typename T=int>struct color
{
    T red, green, blue;
    color(T r, T g, T b)
    :red(r), green(g), blue(b)
    {
    }

    #ifdef SDL_BACKEND
    template<typename R,typename S> R map(S surf)
    {
        return SDL_MapRGB(surf->format,red,green,blue);
    }
    #endif /* SDL_BACKEND */
};

我在这里使用它:

pro::color<int> black(0,0,0);
SDL_FillRect(screen, 0, black.map(screen));

现在这是我得到的错误:

  

错误:没有匹配函数来调用'pro :: color :: map(SDL_Surface *&amp;)'|

我在模板方面没有经验,所以我之前没有看到过这个错误。究竟是什么问题?

注意:我没有用“SDL”标签标记这个,因为恕我直言这个问题与模板更相关,我使用SDL的事实是无关紧要的。我也在使用gcc-4.4x和-std=c++0x

1 个答案:

答案 0 :(得分:4)

这与元编程无关。这只是正确使用模板的问题。无法推断出返回类型,因此您必须指定它;无论是在函数中还是在模板实例化中。即,选择这两个中的一个:

// Version #1: Change function definition
template<typename S> Uint32 map(S surf) { return SDL_MapRGB(surf->format,red,green,blue); }


// Version #2: Change invocation
black.map<Uint32>(screen);

(事实上,我真的不明白为什么你需要一个模板。为什么不把这个函数变成Uint32 map(SDL_Surface *)?)