2011-11-14 104 views
12

此代碼如何使用指向靜態成員函數的函數指針作爲模板參數?

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() {} 

導致以下錯誤消息(GCC 4.4.5):做下列任一後

test.cc:6: error: 'static void A<T>::static_func() [with T = int]' 
        cannot appear in a constant-expression 

錯誤消失:

  1. 限定call的模板參數與A::A<T>::,即使用call<A::static_func>()代替call<static_func>()

  2. 刪除模板參數A,即使A成爲非模板類​​。

  3. 使static_func()成爲一個全局函數(與外部鏈接)。

爲什麼上面的代碼錯了?爲什麼上述修復工作?特別是1和2對我來說似乎很陌生。從錯誤信息來看,額外的資格似乎並沒有提供編譯器不知道的任何信息。

+0

第一種選擇是我想說的。 –

+2

@JoachimPileborg:那當然是我現在使用的。我只想了解這裏發生了什麼。 –

+0

這聽起來像是它可能與編譯器的兩階段查找的實現有關。 – bames53

回答

5

這是一個bug in GCC

+1

謝謝。令人放心的是,至少編譯器是錯的,而不是我。 :) –

相關問題