Visual studio 2010のnamespace付きメタテンプレート関数宣言時のバグ

3375 ワード

もちろんこれは確かにコンパイラには難しいです.しかし、確かにコンパイラのバグで、コードをつけるべきです.
コンパイル環境visual studio 2010、SP 1バージョン.
 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 C 2063:'ZEN_LIB::hash_fun' : not a function
私のコードの本意はZEN_を望みますHash_MD 5はすべての詳細を外部に遮断し、ZEN_のみに対してLIB::hash_fun関数は放したが,結果はだめであることが分かった.
自分が書き間違えたのではないか確認した後、いくつかのテストをしましたが、
 
1.ZEN_をHash_MD 5 ZEN_へ移動LIBネームスペースにて、友元声明にてZEN_を削除LIB、コンパイルパス.
2.テンプレート関数hash_fun移動出ZEN_LIB、友元声明でZENを取り除くLIB、コンパイルパス.
3.ZENを宣言してみるLIB名前空間における非テンプレート関数は,コンパイルにより通過する.
銃口にぶつかったようだが、もういい.コンパイラは難しいです.