visual studio 2010 在使用带namespace友元模板函数声明时的bug
当然这个的确有点难为编译器了。但的确应该是编译器的bug,上代码。
编译环境visual studio 2010, SP1版本。
1 namespace ZEN_LIB 2 { 3 4 5 template<typename HASH_STRATEGY> 6 inline unsigned char *hash_fun(const unsigned char *buf, 7 size_t size, 8 unsigned char result[HASH_STRATEGY::HASH_RESULT_SIZE]) 9 { 10 ZEN_ASSERT(result != NULL); 11 12 HASH_STRATEGY::context ctx; 13 HASH_STRATEGY::initialize(&ctx); 14 HASH_STRATEGY::process(&ctx, buf, size); 15 HASH_STRATEGY::finalize(&ctx, buf, size, result); 16 return result; 17 } 18 } 19 20 21 class ZEN_Hash_MD5 22 { 23 friend unsigned char * ZEN_LIB::hash_fun<ZEN_Hash_MD5>(const unsigned char *buf, 24 size_t size, 25 unsigned char result[ZEN_Hash_MD5::HASH_RESULT_SIZE]); 26 };
编译器在第23行报错,error C2063: 'ZEN_LIB::hash_fun' : not a function
我代码的本意是希望ZEN_Hash_MD5 对外屏蔽所有细节,只对ZEN_LIB::hash_fun 函数放开,但结果发现不行。
在确认应该不是自己写错了后,做了几组测试,
1.将ZEN_Hash_MD5 移动到ZEN_LIB 名字空间中,在友元声明上去掉ZEN_LIB,编译通过。
2.将模板函数hash_fun 移动出ZEN_LIB,在友元声明上去掉ZEN_LIB,编译通过。
3.尝试声明一个ZEN_LIB名字空间中的的非模版函数,编译通过。
看来是撞到枪口了,算了。难为编译器了。