2015-05-08 15 views
8

Như được chỉ ra bởi ecatmur, câu hỏi này đã có câu trả lời here.Vấn đề tra cứu tên, GCC và clang không đồng ý

Câu hỏi này là rõ ràng là không trùng lặp với trailing return type using decltype with a variadic template function. Nó thực sự cố gắng đề xuất một giải pháp đơn giản hơn để giải quyết vấn đề trong chuỗi đó. Câu hỏi đặt ra là liệu giải pháp này có đúng theo tiêu chuẩn hay không, bởi vì GCC và clang không đồng ý về nó. Chỉ cần đọc một câu hỏi cẩn thận hơn một chút, và bạn sẽ nhận ra điều đó.

Câu hỏi này được lấy cảm hứng từ this one. Tôi đang cố gắng để tìm ra một giải pháp đơn giản hơn so với những người đã cung cấp, và kết thúc với điều này:

#include <iostream> 

struct S { 
    template <typename T> 
    static T sum(T t){ 
     return t; 
    } 

    template <typename T, typename ...U> 
    static auto sum(T t, U... u) -> decltype(t + sum(u...)) { 
     return t + sum(u...); 
    } 
}; 

int main() { 
    std::cout << S::sum(1, 1.5, 2) << '\n'; 
} 

Trong khi giải pháp này làm việc với GCC, nó không giải quyết được vấn đề gì cả trên kêu vang. Vì vậy, tôi tự hỏi cái nào là đúng.

+0

thất bại trong việc biên dịch cho tôi vào kêu vang: chính. cpp: 10: 17: lưu ý: mẫu ứng viên bị bỏ qua: lỗi thay thế [với T = int, U = ]: không có hàm nào phù hợp để gọi 'sum' tổng tự động tĩnh (T t, U ... u) -> decltype (t + sum (u ...)) { ^ ~~~ main.cpp: 5: 17: note: mẫu chức năng ứng cử viên không t khả thi: yêu cầu đối số đơn 't', nhưng 3 đối số đã được cung cấp tổng tự động tĩnh (T t) { –

+0

@ecatmur Đây không phải là bản sao. Chỉ cần đọc kỹ câu hỏi của tôi một chút và bạn sẽ nhận ra điều đó. – Lingxi

+0

@ecatmur Bạn nói đúng. Gonna đóng câu hỏi này. – Lingxi

Trả lời

0

workaround tốt nhất mà tôi đã đưa ra là:

#include <iostream> 

struct S { 
    template <typename T> 
    static T sum(T t){ 
     return t; 
    } 

    template <typename S, typename T> 
    static auto sum(S s, T t) -> decltype(s + t) { 
     return s + t; 
    } 

    template <typename S, typename T, typename ...U> 
    static auto sum(S s, T t, U... u) -> decltype(s + t) { 
     return s + sum(t, u...); 
    } 
}; 

int main() { 
    std::cout << S::sum(1, 1.5, 2) << '\n'; 
} 

kêu vang dường như có một vấn đề với việc giải quyết các chức năng/phương pháp đệ quy trong chỉ thị decltype ...

+0

'decltype (s + t)' có thể khác với 'decltype (s + x)' trong đó 'x = t + u ...'. – Lingxi

+0

bạn có vẻ đúng - tôi thấy nó đang làm việc trên ví dụ đơn giản của bạn ... hãy để tôi suy nghĩ lại câu trả lời của tôi sau đó ... –

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