2015-06-18 24 views
9

Tại sao mã bên dưới biên dịch? Tôi không chuyên chức năng thành viên mẫu của một lớp mẫu, do đó chỉ nên sử dụng một template<>. Tuy nhiên, g ++ biên dịch nó không có cảnh báo nào, kêu vang ++ cho phép chỉ là một cảnh báoMẫu kép <> trong chuyên môn mẫu

cảnh báo: không liên quan danh sách tham số mẫu trong mẫu chuyên môn

template<typename T> 
struct S{}; 

template<> template<> // why can we do this? 
struct S<int>{}; 

int main() 
{ 

} 
+1

[Báo cáo lỗi này] (https://llvm.org/bugs/show_bug.cgi?id=5559) có thể có liên quan ([đặc biệt là bình luận # 2] (https://llvm.org/bugs/show_bug. cgi? id = 5559 # c2)). – 0x499602D2

+0

@ 0x499602D2 cảm ơn, mặc dù lỗi được báo cáo có ý nghĩa hơn một chút, vì có 2 cấp độ (mặc dù chỉ có một chuyên môn). – vsoftco

+0

@ 0x499602D2: có liên quan? trông giống như một câu trả lời cho tôi;) –

Trả lời

4

Bởi vì ngữ pháp cho phép nó, và có doesn' t dường như là bất kỳ điều gì trong phần chuyên môn mẫu cấm nó:

Từ [gram.temp]

rõ ràng-chuyên môn:

template < >khai

Từ [gram.dcl]

khai:

[...]

rõ ràng-chuyên môn

Thực tế là ngữ pháp là quá lỏng lẻo đã được trong active issues list (# 293) từ năm 2001.

2

Một báo cáo lỗi (nộp như PR5559) từ một già đi nhiều phiên bản của clang cũng thảo luận về vấn đề này. Vấn đề là gcc và clang đều có sự khác biệt khi nói đến việc liệu nhiều khai báo mẫu có hợp lệ trong một chuyên môn rõ ràng hay không. Quoth Gabor Greif:

Lỗi đầu tiên thực sự là không, hãy kiểm tra chính xác chỉ một "template <>" là cần thiết. Nhưng vì g ++ chấp nhận điều này và một số người (giống như tôi) có thể có quan niệm sai lầm rằng số lượng "template <>" được điều chỉnh bằng cách làm tổ thay vì số lượng cấp độ chuyên môn, có thể thú vị để giảm lỗi cho cảnh báo và có thể phát ra một gợi ý sửa lỗi.

Sự khác biệt cũng có thể do định nghĩa chu kỳ của tiêu chuẩn về việc xác định rõ ràng (như được ghi chú bởi @user657267).

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