2011-11-14 25 views
12

Mã nàyLàm thế nào để sử dụng một con trỏ hàm đến một hàm thành viên tĩnh như một tham số mẫu?

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

kết quả trong thông báo lỗi sau đây (gcc 4.4.5):

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

Các lỗi biến mất sau khi làm một trong hai điều sau đây:

  1. Đủ điều kiện các thông số mẫu của call với A:: hoặc A<T>::, tức là sử dụng call<A::static_func>() thay vì call<static_func>().

  2. Xóa thông số mẫu của A, tức là tạo A một lớp không phải mẫu.

  3. Làm cho static_func() chức năng toàn cầu (có liên kết bên ngoài).

Tại sao mã trên sai? Và tại sao các bản sửa lỗi được đề cập hoạt động? Đặc biệt là 1 và 2 có vẻ rất lạ với tôi. Đánh giá từ thông báo lỗi, trình độ bổ sung dường như không cung cấp bất kỳ thông tin nào mà trình biên dịch không biết.

+0

Cách thay thế đầu tiên là giải pháp thay thế phù hợp nhất. –

+2

@JoachimPileborg: Đó là tất nhiên những gì tôi đang sử dụng cho bây giờ. Tôi chỉ muốn hiểu những gì đang xảy ra ở đây. –

+0

Nghe có vẻ như nó có thể có một cái gì đó để làm với việc thực hiện của trình biên dịch tra cứu hai giai đoạn hoặc một cái gì đó. – bames53

Trả lời

5

Đây là bug in GCC.

+1

Cảm ơn. Đó là yên tâm rằng ít nhất một lần trình biên dịch là sai, không phải tôi. :) –

Các vấn đề liên quan