我有這樣的模板:錯誤使用一個函數作爲非類型模板參數
template <class SourceFormat, class DestFormat, void (*convert)(DestFormat, SourceFormat)>
static void _draw(...);
而這些功能:
template <class Class1, class Class2>
inline static void convertNone(Class1& dest, Class2& source) {
dest = source;
};
inline static void convertARGB_GREY(unsigned __int32& dest, unsigned __int8& source) {
dest = source + (source << 8);
dest += (dest << 16);
};
我使用模板的另一個功能:
void Blitter::draw(...) {
if (...) {
_draw<unsigned __int32, unsigned __int32, &convertNone>(...);
} else {
_draw<unsigned __int32, unsigned __int8, &convertARGB_GREY>(...); // ERRORS go here!
}
}
我得到這些錯誤:
Error 1 error C2440: 'specialization' : cannot convert from 'void (__cdecl *)(unsigned int &,unsigned char &)' to 'void (__cdecl *const)(unsigned char,unsigned int)' d:\projects\fanlib\source\blitter.cpp 102
Error 2 error C2973: 'FANLib::Blitter::_draw' : invalid template argument 'void (__cdecl *)(unsigned int &,unsigned char &)' d:\projects\fanlib\source\blitter.cpp 102
我想這是相當明顯的,我不完全理解的功能,作爲參數... :-(
提前
此外,該消息表明他有他的char和int混合起來(到OP,*讀*消息)。 – UncleBens 2010-02-03 20:19:49
來UncleBens:你說得對,我應該仔細閱讀錯誤信息。我實際上停止閱讀它: 「無法從'void(__cdecl *)...轉換爲'void(__cdecl * const)」。愚蠢的是,我認爲這是'常量',無法轉換!我值得痛苦的死亡: - | – 2010-02-04 10:23:23
To AndreyT:您定義爲非法的兩個問題 - 函數定義結束時的分號和作爲模板參數的非外部靜態函數 - 在Visual 2008中編譯得很好。我認爲損害可移植性,但另一方面它們聽起來很像舊的不必要的語言障礙比干淨的編碼標準...: - ? – 2010-02-04 10:36:36