2009-09-13 10 views
6

テンプレート引数としてのポインタのキャスト:ComeauとMSVCのコンパイル、GCCの失敗

template<int* a> 
class base {}; 

int main() 
{ 
    base<(int*)0> test; 
    return 0; 
} 

ComeauとMSVCの両方で問題なくコンパイルできます(使用されていない変数についてはComeauの警告を除きます)。GZはbase<(int*)0> test;行で失敗します.

関数 ` int main() ': 整数型または列挙型以外の型へのキャストは定数式には現れません

テンプレート引数1が無効です

それはどういうことですか?そして、誰が正しいのですか?このコードをコンパイルする必要がありますか?私のGCCバージョンはが非常に古い(3.4.2)ので、それが何かと関係するかもしれないことに注意する価値があります。ありがとう。

+0

: ます。test.cpp:6:エラー:GCC 4.4.1で6:エラー:テンプレート整数または列挙型以外へのキャストは、定数式 TEST.CPPに表示することはできません引数1は無効です test.cpp:6:エラー: ';'の前の宣言で無効な型です。トークン – jdehaan

+0

ありがとう、私はこれが私のバージョンとは関係ないことを知っています。 – GRB

+0

歓迎します。私はコンパイルするためにコードを少し修正しようとしました。わずかな違いは問題を明確にしていませんでした。 – jdehaan

答えて

8

(強調は追加):NULLポインタが「外部結合を持つという名前のオブジェクト」を指していないよう

 
14.1.3 A non-type template-parameter shall have one of the following (option- 
    ally cv-qualified) types: 
    ... 
    --pointer to object, accepting an address constant expression desig- 
    nating a named object with external linkage, 
    ... 

どうやら、それは、NULLポインタでテンプレートをインスタンス化するために法的ではありません。 FYI

+0

関連する:http://stackoverflow.com/questions/275871/how-to-overcome-gcc-restriction-could-not-convert-template-argument-0-to-foo – Managu

+1

+1!私はパラメータとしてintへのポインタを与えることによって試してみましたが、エラーが発生しました(前のかなりわかりにくいものよりも優れています) エラー: '&a'は型 'int *'の有効なテンプレート引数ではありません外部リンクを持たない – jdehaan

+1

これは有望そうだが、GCCとComeauがなぜ違うのか、これは答えないと思う。例えば、 'base <(int*)1>'に変更すると、ComeauとGCCの両方がコンパイルに失敗します。さらに、この要件が「ドラフト」からのものであれば、私のGCCはそれを4年前にコンパイルできません。そのため、これが標準に追加されていれば、GCCのチョーク。 – GRB

関連する問題