2015-06-17 16 views
8

mã đến từ một cuốn sách C++ như sau:sử dụng tên lớp trong mẫu lớp không có thông số mẫu

Tại sao thành viên công cộng này Link * tiếp theo không có đối số tên tệp?

template <typename E> class Link { 
private: 
    static Link<E>* freelist; 
public: 
    E element; 
    Link* next; // this line confused me.... 

    Link(const E& elemval, Link* nextval = NULL) 
    { 
     element = elemval; next = nextval; 
    } 
    Link(Link* nextval = NULL) { next = nextval; } 
    void* operator new(size t){ 
     if (freelist == NULL) return ::new Link; 
     Link<E>* temp = freelist; 
     freelist = freelist->next; 
     return temp; // Return the link 
    } 
}; 

Tôi nghĩ rằng nó phải là Link<E>* next.

Hãy cho tôi biết lý do không có đối số mẫu.

Trả lời

13

Điều này được gọi là "tên lớp được tiêm". Các quy tắc đặc biệt xuất phát từ [temp.local]:

Giống như (không mẫu) các lớp học bình thường, lớp mẫu có một tiêm-class-name (khoản 9). Bạn có thể sử dụng loại được tiêm- tên làm mẫu mẫu hoặc loại tên. Khi nó được sử dụng với một mẫu đối số-list, như một mẫu đối số cho một mẫu mẫu tham số, hoặc như nhận diện cuối cùng trong xây dựng-type-specifier của một lớp người bạn tuyên bố mẫu, nó đề cập đến chính mẫu lớp đó. Nếu không, tương đương với tên mẫu , sau đó là thông số mẫu của mẫu lớp được đính kèm trong <>.

Trong phạm vi của một lớp mẫu chuyên môn hoặc chuyên môn hóa một phần, khi tiêm-class-name là sử dụng như một loại tên, nó tương đương với các mẫu tên tuổi tiếp theo là đối số mẫu của lớp chuyên môn về mẫu hoặc một phần chuyên môn được đính kèm trong <>. [Ví dụ:

template<template<class> class T> class A { }; 
template<class T> class Y; 
template<> class Y<int> { 
    Y* p;        // meaning Y<int> 
    Y<char>* q;       // meaning Y<char> 
    A<Y>* a;        // meaning A<::Y> 
    class B { 
     template<class> friend class Y; // meaning ::Y 
    }; 
}; 

dụ -end]

này về cơ bản là cho thuận tiện, do đó tên lớp trong lớp đề cập đến lớp chính nó và không bất cứ điều gì bên ngoài mà có thể có cùng tên. Đối với các mẫu lớp, nó có khả năng tiết kiệm rất nhiều đánh máy nếu bạn có một danh sách đối số mẫu dài.

+0

để tương đương với Liên kết * tiếp theo và Liên kết * tiếp theo? – Makoto

+2

@Makoto Trong "mẫu lớp Liên kết {...};', vâng. – Barry

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