请参阅,我有这段代码:
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
。
答案 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 *)
?)