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
錯誤消失:
限定
call
的模板參數與A::
或A<T>::
,即使用call<A::static_func>()
代替call<static_func>()
。刪除模板參數
A
,即使A
成爲非模板類。使
static_func()
成爲一個全局函數(與外部鏈接)。
爲什麼上面的代碼錯了?爲什麼上述修復工作?特別是1和2對我來說似乎很陌生。從錯誤信息來看,額外的資格似乎並沒有提供編譯器不知道的任何信息。
第一種選擇是我想說的。 –
@JoachimPileborg:那當然是我現在使用的。我只想了解這裏發生了什麼。 –
這聽起來像是它可能與編譯器的兩階段查找的實現有關。 – bames53