2012-06-27 29 views
8

tôi có mã này:Các tham số mẫu mặc định: Tại sao trình biên dịch phàn nàn về việc không chỉ rõ đối số mẫu?

struct A{}; 

template<class T = A> 
struct B { 
    void foo() {} 
}; 

B b; //Error: missing template arguments before 'b' 
    //Error: expected ';' before 'b' 
    //More errors 
b.foo() 

Nếu tôi làm foo() làm mẫu chức năng với cùng mẫu chữ ký ', trình biên dịch không phàn nàn về việc không quy định cụ thể các đối số mẫu:

struct A {}; 

struct B { 
    template<class T = A> 
    void foo() {} 
}; 

B b; //OK 
b.foo() 

Vì vậy, tại sao tôi cần phải xác định một đối số cho một lớp mẫu với một tham số mặc định, nhưng không phải cho một hàm mẫu? Có một số tinh tế tôi đang thiếu?

Lý do là do lỗi khấu trừ đối số mẫu cho chắc chắn. Nhưng tôi muốn biết tại sao.

+0

Có một từ nào bị thiếu trong tiêu đề của câu hỏi này không? – Pointy

+0

Có. Thiếu từ - phàn nàn. Đã thêm nó. – badmaash

+0

Bản sao có thể có của * [Đối số mẫu mặc định cho mẫu chức năng] (http://stackoverflow.com/questions/2447458/default-template-arguments-for-function-templates) *. –

Trả lời

7

Cú pháp đúng là này (demo):

B<> b; 

Giá trị mặc định luận A được giả định cho lớp mẫu B. Phần <> cho trình biên dịch biết rằng B là một mẫu lớp và yêu cầu nó lấy tham số mặc định làm đối số mẫu cho nó.

+0

Tôi hiểu. Nhưng tại sao hàm mẫu làm việc mà không có điều này: 'b.foo <>()'? – badmaash

+1

@badmaash: Điều đó không hoạt động: http://ideone.com/QhWgJ – Nawaz

+0

Tệ của tôi. Nên đã đề cập g ++ 4.7.0 có hỗ trợ cho các tham số mẫu mặc định cho các hàm. Vì vậy, mã trên chắc chắn hoạt động. Hãy thử chạy với g ++ 4.7.0. – badmaash

0

Bởi vì bạn có thể nói rằng B là một mẫu:

B<> b; 

Ngay cả khi bạn không muốn để xác định bất kỳ đối số.

+0

Thực ra bạn cần '<>' để nói cho trình biên dịch bạn không muốn một mẫu, nhưng sự khởi tạo của một khuôn mẫu với đối số mặc định. Cú pháp là chính xác mặc dù. –

1

Cú pháp đúng, như Nawaz đề cập đến đã là:

B<> b; 

Lý do là B là mẫu và B<> là instantiation của mẫu với tham số mặc định A. Nhưng bạn cần <> để phân biệt khi bạn muốn có một sự khởi tạo.