现在的位置: 首页 > 综合 > 正文

visual studio 2010 在使用带namespace友元模板函数声明时的bug

2012年11月29日 ⁄ 综合 ⁄ 共 894字 ⁄ 字号 评论关闭

当然这个的确有点难为编译器了。但的确应该是编译器的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名字空间中的的非模版函数,编译通过。

看来是撞到枪口了,算了。难为编译器了。

 

 

抱歉!评论已关闭.