2011-11-14 6 views
12

このコードスタティックメンバ関数への関数ポインタをテンプレートパラメータとして使用する方法はありますか?次のエラーメッセージ(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 

エラーは、次のいずれかを実行した後に消える:

  1. 修飾しますテンプレートパラメータcallA::またはA<T>::と置き換えます。すなわち、の代わりにcall<A::static_func>()を使用します。。

  2. Aのテンプレートパラメータを削除します。つまり、Aを非テンプレートクラスにします。

  3. メイクstatic_func()グローバルな機能(外部リンケージあり)。

なぜ上記のコードが間違っていますか?そして、なぜ言及された修正が機能するのですか?特に1と2は私にとっては非常に奇妙なようです。エラーメッセージから判断すると、追加の資格は、コンパイラがとにかく知らない情報を提供していないようです。

+0

最初の選択肢は、私が言いたいことです。 –

+2

@JoachimPileborg:もちろんこれは私が今使っているものです。私はちょうどここで何が起こっているのか理解したいと思います。 –

+0

これは、コンパイラの2フェーズルックアップなどの実装と関係があるようです。 – bames53

答えて

5

これはbug in GCCです。

+1

ありがとうございます。少なくともコンパイラが間違っていて、私ではないことが安心です。 :) –

関連する問題