ロック済み VC, 関数テンプレート特殊化とデフォルト引数の型

  • 2011年9月9日 19:37
     
      コードあり

    1. VS 2010 の cl で以下が通りません。

    template<typename T> void f(T* =0){}
    template<> void f<char>(char*){}
    template<> void f<int>(int*){}
    int main(){
      f<char>();
      f<int>();
      return 0;
    }
    
    

    エラーメッセージは以下の通りです。

    x.cpp(5) : error C2440: 'default argument' : 'T *' から 'char *' に変換できません。
            指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
    x.cpp(6) : error C2440: 'default argument' : 'T *' から 'int *' に変換できません。
            指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。


    2. そこで、f(T* =0) を f(T* =(T*)0) に変えてみると、5 行目のエラーは消えますが、6 行目でまたエラーになります。(以下)

     

    template<typename T> void f(T* =(T*)0){}
    template<> void f<char>(char*){}
    template<> void f<int>(int*){}
    int main(){
      f<char>();
      f<int>();
      return 0;
    }
    x.cpp(6) : error C2440: 'default argument' : 'char *' から 'int *' に変換できません。
            指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。

    g++ 3 / g++ 4 では通るのでコード自体に問題はないと思うのですが、何が悪いのでしょう。

    (畏れながら書きますとコンパイラの不具合じゃないかと思うのですが。)

    環境: 以下の三つのコンパイラで全く同じ動作でした。

    - Win XP, VS2008 の cl (version 15.00.30729.01 for 80x86)

    - Win XP, VS2010 beta2 の cl (version 16.00.21003.01 for 80x86)

    - Win 7, VS2010 の cl (version 16.00.30319.01 for 80x86)


     

     

     

すべての返信

  • 2011年11月14日 0:22
     
     

    回答でないですけど、次のコンパイラでも問題なく通りました:

    - Solais Studio 12.2 @ OpenIndiana(SunOS 5.11)

    - llvm/Clang Ver. 2.9 @ Fedora 16

    - Open64 Ver. 5.0 @ Fedora 16

     

  • 2011年11月14日 1:06
     
     

    f(T* =(T*)0)にした場合

    Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86
    # VS2010 SP1

    Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 17.00.40825.2 for 80x86
    # VS11  Developer Preview

    で通りました。元のソースですとどちらも通りませんでした。