2014-12-16 27 views
5

Tôi đang cố nắm bắt đầy đủ cú pháp mẫu và ngữ nghĩa hơn bằng cách tưởng tượng các cấu trúc phức tạp. Tôi tin rằng cú pháp sau đây không được phép theo tiêu chuẩn C++ 11:Ở đâu trong tiêu chuẩn C++ 11 nó cấm 'mẫu <typename T> lớp A {...}; mẫu <typename T> lớp A <int> {...}; ' (nếu ở đâu)?

template <typename T> 
class A 
{...}; 

// phony "specialization" 
template <typename T> 
class A<int> 
{...}; 

Tuy nhiên, tôi không thể tìm thấy trong tiêu chuẩn C++ 11 khi cú pháp này không được phép.

Tôi có đúng là cú pháp được hiển thị không được phép theo tiêu chuẩn C++ 11 không? Nếu vậy, có thể thấy rằng cú pháp không được phép ở đâu?

+1

Đây là lỗi bạn gặp phải với lỗi clang ++: ": chuyên môn từng phần của 'A' không sử dụng bất kỳ tham số mẫu nào của nó". Vì vậy, tôi đoán bạn phải tìm kiếm phần về chuyên môn hóa một phần, liên quan đến việc sử dụng các tham số mẫu của nó. PS: g ++ chỉ nói "lỗi: các tham số mẫu không được khấu trừ trong chuyên môn từng phần:" – vsoftco

+0

@vsoftco Giả sử bạn có 'mẫu lớp A {T t; }; ' –

+0

@Yakk có thể câu trả lời là do thực tế là không thể cho phép cấu trúc có ý nghĩa rằng nó không được phép, hoặc thực tế là nó không được mô tả ở bất kỳ đâu như là một cấu trúc * được phép làm cho nó không được phép, thay vì nó đặc biệt không được phép ở bất cứ đâu. –

Trả lời

3

Tôi khá ngạc nhiên rằng không có tuyên bố rõ ràng trong 14.5.5 [temp.class.spec] nói rằng tất cả các tham số mẫu của một chuyên biệt từng phần mẫu lớp phải được sử dụng trong danh sách-đối số-danh sách. Điều đó sẽ làm cho template<class T> class A<int> không hợp lệ vì T không được sử dụng trong mẫu-đối số-danh sách <int>.

Tôi nghĩ chuyên môn giả mạo của bạn chỉ hoàn toàn không hợp lệ do thực tế bạn không bao giờ có thể so khớp nó, vì vậy nó không bao giờ có thể được sử dụng. Nếu bạn khởi tạo A<int> thì nó khớp với mẫu chính. Nó không thể khớp với chuyên môn của bạn, bởi vì có tham số mẫu bổ sung, T, không thể được suy luận (bạn đề xuất nó có thể được cung cấp bằng cách nói A<int><double> nhưng đó không phải là cú pháp C++ hợp lệ, do đó không giúp được).

Tôi đã yêu cầu ủy ban tiêu chuẩn làm rõ lý do tại sao chuyên môn giả mạo của bạn không hợp lệ (rõ ràng là vậy, nhưng tôi không thể nhìn thấy nó nói ở đâu).

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