2014-05-12 38 views
9

Xét đoạn mã sau, trong đó sử dụng một hàm với đối số biến:Clang: Mẫu khấu trừ thất bại 'đúp' vs '<double>'

#include <iostream> 

// Typedef function type 
template<typename... Output> 
using Func = void(Output*...); 

// Function runner 
template<typename... Output> 
void run_func(Func<Output...>& func, Output*... output) { 
    for (int i=0 ; i < 10 ; ++i) { 
    func(output...); 
    } 
} 

void f(double* d) { 
    *d *= 2; 
}; 

int main() { 
    double value = 1.0; 
    run_func(f, &value); 
    printf("%f\n", value); 
} 

Biên dịch này với g ++ 4.7.3 hoạt động tốt, và chạy sản xuất 1024.0 như kỳ vọng.

Biên soạn bằng 14.0.2 ICPC treo nó ...

templ.cc(21): internal error: assertion failed: lower_expr: bad kind (shared/cfe/edgcpfe/lower_il.c, line 18582) 

    run_func(f, &value); 
    ^

Biên soạn với kêu vang 3.5.0-1 cung cấp cho các thông báo lỗi sau:

templ.cc:21:3: error: no matching function for call to 'run_func' 
    run_func(f, &value); 
    ^~~~~~~~ 
templ.cc:9:6: note: candidate template ignored: deduced conflicting types for parameter 'Output' ('double' vs. <double>) 
void run_func(Func<Output...>& func, Output*... output) { 
    ^

Đây có phải là một lỗi, hoặc nên có g ++ không biên dịch này?

Tại sao clang suy ra các loại "xung đột" này là double<double>, là <double> có nghĩa là đại diện cho một danh sách lập trình chưa được giải nén chẳng hạn?

Cập nhật icpc 14.0.3 không bị lỗi và chương trình biên dịch và chạy chính xác.

Xem DPD200244439 tại Intel® Composer XE 2013 SP1 Compilers Fixes List

+0

Câu hỏi cuối cùng bạn có thể tự trả lời bằng cách chuyển run_func (f, & value & & value) ... kết quả là mà tôi không nghĩ là chính xác ... bạn có thể muốn thử nhiều hơn clang gần đây từ svn, nó có mùi giống như một lỗi – PlasmaHH

+6

Vì việc thay thế 'mẫu sử dụng' với kiểu gốc làm cho vấn đề biến mất, nó cảm thấy rất giống một lỗi. –

+0

@PlasmaHH Tôi đã thử phiên bản tiếng kêu 3.5.0 (thân 208562), cùng một vấn đề! – WaelJ

Trả lời

1

Sau khi thảo luận ở trên, có vẻ như rằng đây thực sự là một lỗi trong kêu vang.

Như đã chỉ ra bởi gha.st, bỏ qua template using và sử dụng các loại chức năng có nguồn gốc trực tiếp hoạt động:

void run_func(void (&func)(Output*...), Output*... output) { 

Tôi đã một đệ đơn chống lại lỗi here này.

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