Я подозреваю, что все эти функции бесплатные. Когда вы объявляете бесплатную функцию static
, она получает внутреннюю связь. Параметры шаблона, не являющиеся типами, в C ++ 03 должны иметь внешнюю связь †. Просто удалите static
перед функциями.
template <
bool src_alpha,
int sbpp, int dbpp,
typename T1, typename T2,
char (*getFunc)(T1 data, unsigned* addr),
void (*putFunc)(T2 data, unsigned* addr, char c)
>
void OperateOnSurfaces(){}
template<bool alpha, int bpp>
char GetPixel(void* format, unsigned* addr);
template<bool alpha, bool alphablend, int bpp>
void PutPixel(void* format, unsigned* addr, char col);
int main(){
OperateOnSurfaces<
true,
32, 32,
void*, void*,
GetPixel<true,32>, PutPixel<true,true,32> >();
}
Этот модифицированный пример отлично компилируется на Clang 3.1 и GCc 4.4.5 в режиме C ++ 98 и C ++ 11, без предупреждений. Если я оставлю static
внутри, я получу аналогичную ошибку + примечание к тому, что у вас было с Clang, и GCC выдаст важную информацию (прокрутите вправо, не имеет внешней связи):
15:02:38 $ g++ t.cpp
t.cpp: In function ‘int main()’:
t.cpp:21: error: ‘GetPixel<true, 32>’ is not a valid template argument for type ‘char (*)(void*, unsigned int*)’ because function ‘char GetPixel(void*, unsigned int*) [with bool alpha = true, int bpp = 32]’ has not external linkage
t.cpp:21: error: ‘PutPixel<true, true, 32>’ is not a valid template argument for type ‘void (*)(void*, unsigned int*, char)’ because function ‘void PutPixel(void*, unsigned int*, char) [with bool alpha = true, bool alphablend = true, int bpp = 32]’ has not external linkage
t.cpp:21: error: no matching function for call to ‘OperateOnSurfaces()’
† (C++03) §14.3.2 [temp.arg.nontype] p1
аргумент-шаблона для не-типа, не шаблона параметр-шаблона должен быть одним из:
Обратите внимание, что C ++ 11 изменил формулировку и теперь поддерживает функции с внутренней связью:
(C++11) §14.3.2 [temp.arg.nontype] p1
аргумент-шаблона для не-типа, не шаблона параметр-шаблона должен быть одним из:
Clang в настоящее время не подчиняется этому в режиме C ++ 11, он по-прежнему разрешает только функции с внешней связью.
person
Xeo
schedule
25.12.2011
namespace detail
. Кроме того, это бесплатные функции или статические функции-члены? Кроме того, какой компилятор вы используете? - person Xeo   schedule 25.12.2011static
) не могут использоваться в качестве аргументов шаблона, не являющегося типом. - person Kerrek SB   schedule 25.12.2011