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名字空间中的的非模版函数,编译通过。

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

 

 

你可能感兴趣的:(namespace)