2015-04-21 13 views
7

Các mã sau biên dịch tốt với g ++, nhưng không phải với kêu vang ++ (3.6):kêu vang ++ lỗi trên tuyên bố mẫu tham số mặc định cuối

// Forward declaration: 
template <class S, class T> 
struct Base; 

template <class T> 
struct BaseFriend { 
    friend struct Base<int, T>; 
}; 

// Actual declaration: 
template <class S, class T = int> 
struct Base { 
    void foo() {} 
}; 

struct DerivedFriend : BaseFriend<int> {}; 

struct Derived : Base<int> { 
    void foo(int) { 
     Base<int>::foo(); 
    } 
}; 

Lỗi xảy ra trong định nghĩa Derived::foo:

error: too few template arguments for class template 'Base' 
    Base<int>::foo(); 
    ^
test.cpp:3:8: note: template is declared here 
struct Base; 
    ^

Lỗi đi sau vài bản sửa lỗi nhỏ, như:

  1. Nếu thông số mẫu mặc định được xác định trong chuyển tiếp khai báo thay vì khai báo thực tế.
  2. Hoặc nếu DerivedFriend không được sử dụng.

Nhưng điều gì sai với mã gốc?

+0

này trông giống như một lỗi kêu vang. – aschepler

+0

Nộp một [báo cáo lỗi] (https://llvm.org/bugs/) - điều này khá rõ ràng là một lỗi clang, như GCC 4.9, ICC 13 và MSVC 17 (VS2012) tất cả chấp nhận mã. – LThode

+2

Báo cáo lỗi đã được gửi https://llvm.org/bugs/show_bug.cgi?id=23303 –

Trả lời

4

Chắc chắn là một lỗi lóng, trông giống như #10147. Các tiêu chuẩn cho phép rõ ràng này [temp.param]/10:

Tập hợp các mẫu mặc định-đối số có sẵn để sử dụng với một tuyên bố hoặc định nghĩa mẫu thu được bằng cách sáp nhập các đối số mặc định từ định nghĩa (nếu trong phạm vi) và tất cả các khai báo trong phạm vi trong cùng một đối số chức năng mặc định theo cách là (8.3.6). [Ví dụ:

template<class T1, class T2 = int> class A; 
template<class T1 = int, class T2> class A; 

tương đương với

template<class T1 = int, class T2 = int> class A; 

-end dụ]

+0

Vâng, nó chắc chắn là ở sân chơi bóng chày # 10147, mặc dù không giống với việc nhìn vào bản báo cáo đó ... – LThode

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