2016-05-25 17 views
5

Rất thường trong định nghĩa lớp C++, đặc biệt là trong các thư viện, lớp học đặc điểm vv, bạn xem mã tương tự như đoạn sau đây:Tại sao các tham số mẫu tên tệp không được nhận dạng ngầm là các loại?

template <typename Bar, typename Baz> 
class Foo { 
    using bar_type = Bar; 
    using baz_type = Baz; 
    // ... etc. 
} 

Và chỉ với những dòng này bạn có thể tham khảo sau Foo<A,B>::bar_type hoặc Foo<C,D>:baz_type. Tôi tự hỏi: Tại sao tiêu chuẩn ngôn ngữ yêu cầu trình biên dịch tự động xác định các loại bằng cách sử dụng các thông số mẫu tên, tức là cho phép xóa hai dòng bằng cách sử dụng, và nhận ra Foo<A,B>::BarAFoo<C,D>::BazD?

Điều này thậm chí không nên phá vỡ mã hiện tại, vì trong Foo, các mã định danh Bar và Baz cũng đã được lấy.

+0

Vì chúng có thể không phải là loại. Ví dụ, chúng có thể là một giá trị, ví dụ, N trong 'template struct array' – davidbak

+5

Chúng không phải lúc nào cũng cần thiết, và phơi bày chúng có nghĩa là mã máy khách có thể được ghép nối với chúng (giả sử bạn có nghĩa là những bí danh đó là công khai.) – juanchopanza

+1

Câu trả lời khác: Bởi vì nó tầm thường để tự làm. Đó là câu trả lời được đưa ra khi ai đó hỏi tại sao không có một từ khóa 'super' trong C++ (nhưng tôi không có tham chiếu đến điều đó trong tầm tay). – davidbak

Trả lời

7

Tên tham số không phải là một phần của đối tượng đang được khai báo. Điều này đúng cho cả hai hàm và mẫu. Các mã sau đây chỉ tuyên bố hai thực thể riêng biệt:

extern void f(int, char, bool); 
extern void f(int a, char b, bool c); 
extern void f(int x, char b, bool z); 

template <typename> struct X; 
template <typename A> struct X; 
template <typename T> struct X; 

Lưu ý đặc biệt là đoạn mã sau là hoàn toàn tốt đẹp:

template <typename T> struct X { void f(); }; // X<T>::f not yet defined 
template <typename U> void X<U>::f() {}   // now it's defined 

Tất cả các nỗ lực phát sinh cấu trúc bổ sung từ tên tham số phải đối phó với tình trạng này. Một trong những yêu cầu phổ biến nhất trong lĩnh vực này được đặt tên là các tham số hàm; cho đến nay đã không có một đề nghị thỏa đáng cho một phần mở rộng như vậy.

Ở một mức độ nào đó, tất cả các đề xuất như vậy sẽ yêu cầu đặt tên tham số là một phần của thực thể được khai báo. Ví dụ, đối với các hàm, điều đó sẽ làm tăng câu hỏi liệu các tên tham số có cần phải bị xáo trộn và tiếp xúc với trình liên kết hay không.

+0

Ai biết được. Một trong những ẩn ý của tên của các tham số trở thành một phần của chữ ký chức năng có thể là nó mở ra cho bạn các công ty như [Oracle] (https://en.wikipedia.org/wiki/Oracle_America,_Inc._v._Google,_Inc.) suing của bạn ass trên nó. –

+0

Tôi liên tục chán nản với mọi người (không phải bạn rõ ràng), những người bực mình vì thắc mắc về lý do tại sao nguyên trạng là gì, và downvote hoặc bỏ phiếu để đóng không có bình luận - khi có câu trả lời hoàn toàn hợp lý (xác nhận hợp lý lý do cho câu hỏi.) – einpoklum

+0

@einpoklum: Tôi nghĩ đây là một câu hỏi hay và tôi rất vui vì đã đọc câu hỏi và câu trả lời. Tuy nhiên tôi phải thừa nhận rằng khi lần đầu tiên đọc nó, tôi đã bị cám dỗ để bỏ phiếu để đóng không phải là germane để ngăn xếp tràn. Lý do tôi đoán là dòng này "Đã bao giờ đề xuất này? Thảo luận? Bị từ chối?" Tôi không nghĩ rằng các yêu cầu lịch sử tùy ý vào C++ tạo ra các câu hỏi SO tốt - những câu hỏi cần phải được lập trình và lý tưởng, quan tâm đến một lập trình viên làm việc, chứ không phải là một nhà nghiên cứu hay IMO. Nếu không có dòng đó, tôi có lẽ sẽ bỏ phiếu. Tôi chỉ là một điểm mẫu, YMMV. –

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