2012-06-28 21 views
5

Tôi cố gắng triển khai lựa chọn thuật toán biên dịch theo thời gian sử dụng chuyên môn mẫu.GCC 4.7.1 Vấn đề biểu hiện liên tục tổng quát với quá tải

tôi băm đoạn mã sau:

template <class C> 
    struct choose 
    { 
     typedef size_t (*type)(const C*); 
     static constexpr type value = java_string_hashcode<C>; 
    }; 

tôi đã chuyên cấu trúc này cho char loại:

template <> 
    struct choose<char> 
    { 
     typedef size_t (*type)(const char*); 
     static constexpr type value = fnv_1a_32_hash; 
    }; 

Nhưng khi tôi cố gắng để biên dịch nó, tôi nhận được lỗi sau với GCC 4.7 .1:

error: field initializer is not constant

Tôi nghĩ rằng vấn đề xuất phát từ thực tế là fnv_1a_32_hash chức năng là quá tải, ngay cả khi IMO các diễn viên tiềm ẩn để size_t (*)(const char*) nên đối phó với vấn đề này.

cuối cùng tôi đã tìm thấy một workaround, bởi một trong hai đổi tên quá tải hoặc chỉ đơn giản đúc việc gán:

static constexpr type value = (type)fnv_1a_32_hash; 

Câu hỏi của tôi là: đây là một lỗi biên dịch? Hay tôi đang thiếu một cái gì đó? Vui lòng giải thích và trích dẫn thông số kỹ thuật bất cứ khi nào cần.


chi tiết thực hiện fnv_1a_32_hash:

constexpr size_t fnv_1a_32_hash(const char* p, size_t h) noexcept 
{ 
    return (*p == 0) ? h : fnv_1a_32_hash(p + 1, (h^*p) * fnv::prime); 
} 

constexpr size_t fnv_1a_32_hash(const char* p) noexcept 
{ 
    return fnv_1a_32_hash(p, fnv::offset_basis); 
} 
+0

Nếu ở tất cả, tôi nghĩ rằng các thông báo lỗi là một lỗi (không đề cập đến tình trạng quá tải là vấn đề). –

Trả lời

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