2011-11-21 31 views
14

Tôi chỉ đọc bài viết về số CRTP trên wiki và tôi hơi bối rối về việc tạo mẫu.instantiation mẫu lớp

Theo wiki,

cơ quan chức năng thành viên (định nghĩa) không được khởi tạo cho đến khi dài sau khi kê khai.

Tôi không hiểu ý nghĩa của nó.

Giả sử tôi có một lớp mẫu:

template <typename T> 
class A 
{ 
    public: 
     void foo(T t) 
     { 
      //... 
     }; 
}; 

Khi tôi nhanh chóng lớp mẫu A, nó nhanh chóng các hàm thành viên foo()?

Ví dụ:

//in .cpp file 
int main() 
{ 
    A<int> a; //question 1 
       //class template is instantiated here, isn't it? 
       //What about foo(), is it instantiated too? 

    a.foo(10); //question 2 
       //according to the quotation, foo() will not be instantiated until it is used. 
       //if so, foo() is instantiated right here, not in question 1, right? 
} 
+2

Cắm: Điều này có thể trả lời các câu hỏi của bạn: http: // stackoverflow.com/questions/7182359/template-instantiation-details-of-gcc-và-ms-compilers/7241548 # 7241548 –

Trả lời

12

Bạn dường như khó hiểu một điều:

õ xảy ra trong biên soạn, không trong thời gian chạy. Do đó bạn không thể nói "trên dòng nào" một mẫu lớp hoặc một mẫu hàm được khởi tạo.

Điều đó nói rằng, bạn đã đúng về thực tế là các mẫu chức năng thành viên không được khởi tạo cùng với các mẫu lớp học.

Bạn có thể quan sát nó trong một trường hợp như vậy: Bạn có những file sau

  • template.h (định nghĩa lớp A và chức năng A :: foo)
  • a.cpp (sử dụng A)
  • b.cpp (sử dụng A và A :: foo)

Sau đó, trong khi biên soạn a.cpp, chỉ A sẽ được khởi tạo. Tuy nhiên, trong quá trình biên soạn b.cpp, cả hai sẽ được khởi tạo.

Vì lý do này, trong trường hợp A :: foo chứa một số mã không hợp lệ ngữ nghĩa cho một tập hợp các tham số mẫu nhất định, bạn sẽ nhận được các lỗi biên dịch trong b.cpp, nhưng không phải là a.cpp.

Tôi hy vọng xóa mọi thứ!

+0

Tôi hiểu nó ngay bây giờ, cảm ơn bạn. – Alcott

8

Với mẫu lớp, quy tắc chung là chỉ những thành viên đó được khởi tạo thực sự được sử dụng.

Nếu bạn muốn instantiation hoàn chỉnh, C++ cung cấp instantiation rõ ràng (tuy nhiên, thường là bạn không; một thực tế rằng không phải mọi chút là hoàn toàn khởi tạo có nghĩa là mẫu lớp học của bạn thậm chí còn chung chung hơn vì nó làm giảm các yêu cầu về T , lưu ý rằng việc kiểm tra cú pháp và tra cứu các loại không phụ thuộc (những thứ không phụ thuộc vào số T) vẫn xảy ra).

Bạn sẽ tìm thấy câu trả lời hoàn chỉnh hơn tại đây: Template instantiation details of GCC and MS compilers

+0

Đặc biệt để đề cập đến sự khởi tạo hoàn toàn tức thì – FaceBro

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