このコードスタティックメンバ関数への関数ポインタをテンプレートパラメータとして使用する方法はありますか?次のエラーメッセージ(GCC 4.4.5)で
template <void (*func)()>
static void call() { func(); }
template <typename T>
struct A {
A() { call<static_func>(); } // <--- error
static void static_func() {}
};
A<int> a;
int main() {}
結果:
test.cc:6: error: 'static void A<T>::static_func() [with T = int]'
cannot appear in a constant-expression
エラーは、次のいずれかを実行した後に消える:
修飾しますテンプレートパラメータ
call
をA::
またはA<T>::
と置き換えます。すなわち、の代わりにcall<A::static_func>()
を使用します。。A
のテンプレートパラメータを削除します。つまり、A
を非テンプレートクラスにします。メイク
static_func()
グローバルな機能(外部リンケージあり)。
なぜ上記のコードが間違っていますか?そして、なぜ言及された修正が機能するのですか?特に1と2は私にとっては非常に奇妙なようです。エラーメッセージから判断すると、追加の資格は、コンパイラがとにかく知らない情報を提供していないようです。
最初の選択肢は、私が言いたいことです。 –
@JoachimPileborg:もちろんこれは私が今使っているものです。私はちょうどここで何が起こっているのか理解したいと思います。 –
これは、コンパイラの2フェーズルックアップなどの実装と関係があるようです。 – bames53