C++:忽略候选模板:模板参数的显式指定参数无效
我有这个函数头:
template <
bool src_alpha,
int sbpp, int dbpp,
typename T1, typename T2,
Color (*getFunc)(T1 data, Uint8* addr),
void (*putFunc)(T2 data, Uint8* addr, Color c)
>
static void OperateOnSurfaces(T1 data1, T2 data2, SDL_Surface * bmpDest, SDL_Surface * bmpSrc, SDL_Rect& rDest, SDL_Rect& rSrc)
这就是我使用它的方式:
OperateOnSurfaces<
true,
32, 32,
SDL_PixelFormat*, SDL_PixelFormat*,
GetPixel<true,32>, PutPixel<true,true,32> >(
bmpSrc->format, bmpDest->format,
bmpDest, bmpSrc, rDest, rSrc);
这是 GetPixel
和 PutPixel
:
template<bool alpha, int bpp>
static Color GetPixel(SDL_PixelFormat* format, Uint8* addr) { /* .. */ }
template<bool alpha, bool alphablend, int bpp>
static void PutPixel(SDL_PixelFormat* format, Uint8* addr, Color col) { /* .. */ }
我收到此错误:
注意:候选模板被忽略:显式无效- 模板参数“getFunc”的指定参数 [3]
为什么?
I have this function header:
template <
bool src_alpha,
int sbpp, int dbpp,
typename T1, typename T2,
Color (*getFunc)(T1 data, Uint8* addr),
void (*putFunc)(T2 data, Uint8* addr, Color c)
>
static void OperateOnSurfaces(T1 data1, T2 data2, SDL_Surface * bmpDest, SDL_Surface * bmpSrc, SDL_Rect& rDest, SDL_Rect& rSrc)
This is how I use it:
OperateOnSurfaces<
true,
32, 32,
SDL_PixelFormat*, SDL_PixelFormat*,
GetPixel<true,32>, PutPixel<true,true,32> >(
bmpSrc->format, bmpDest->format,
bmpDest, bmpSrc, rDest, rSrc);
This is GetPixel
and PutPixel
:
template<bool alpha, int bpp>
static Color GetPixel(SDL_PixelFormat* format, Uint8* addr) { /* .. */ }
template<bool alpha, bool alphablend, int bpp>
static void PutPixel(SDL_PixelFormat* format, Uint8* addr, Color col) { /* .. */ }
And I get this error:
note: candidate template ignored: invalid explicitly-specified argument for template parameter 'getFunc' [3]
Why?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我怀疑所有这些功能都是免费功能。当您声明一个自由函数
static
时,它会获得内部链接。在 C++03 中,非类型模板参数必须具有外部链接†。只需删除函数前面的static
即可。这个修改后的示例在 C++98 和 C++11 模式下的 Clang 3.1 和 GCc 4.4.5 上编译良好,没有警告。如果我保留
static
,我会收到类似的错误 + 请注意您使用 Clang 得到的信息,并且 GCC 会吐出重要信息(向右滚动,“没有外部链接”):†
(C++03) §14.3.2 [temp.arg.nontype] p1
请注意,C++11 更改了措辞,现在也允许具有内部链接的函数:
(C++11) §14.3.2 [temp.arg.nontype] p1
Clang 目前在 C++11 模式下不遵守这一点,它仍然只允许具有外部链接的函数。
I suspect that all those functions are free functions. When you declare a free function
static
, it gains internal linkage. Non-type template parameters, in C++03, must have external linkage†. Just removestatic
in front of the functions.This modified example compiles fine on Clang 3.1 and GCc 4.4.5 in C++98 and C++11 mode, no warnings. If I leave the
static
in, I get a similar error + note to what you got with Clang, and GCC spits out the vital information (scroll to the right, "has not external linkage"):†
(C++03) §14.3.2 [temp.arg.nontype] p1
Note that C++11 changed the wording and allows functions with internal linkage too now:
(C++11) §14.3.2 [temp.arg.nontype] p1
Clang does currently not obey to this in C++11 mode, it still only allows functions with external linkage.