akasaka_34の日記

ネトウヨと呼ばれた男の日記。しかし頻度から言えば週報ぐらい。

定数式の中にコンストラクタへの呼び出しが現れてはいけません。テンプレート引数1は不正です。

GCC4.4.3のエラーメッセージ。

error: a call to a constructor cannot appear in a constant-expression
error: template argument 1 is invalid

エラーを再現するコードは、たとえばこんな感じ。

template class Foo {
};
void bar() {
void * p = new Foo< Foo< Foo< Foo > >();
}

>が一個足りないことに気がつくまで、小一時間悩んだ。
悩んでいる間は
「このエラーメッセージは一体何を言いたいんじゃい!」
と思っていたが、問題が理解できてからエラーメッセージを見直すと
なんとなく分からんでもない。
new Foo< の後に来るものは「a constant-expression」で
Foo< Foo< Foo > >() が「a call to a constructor」だと言いたいわけだね。
そういうつもりで書いたわけじゃないんだが
そういう風に読むことも可能だ。