2011-11-16 30 views
7

Trên một ý thích, tôi đã cố gắng để xác định các chức năng chính như là một mẫu chức năng sử dụng kêu vang 2.9:Cần trích dẫn từ tiêu chuẩn về tính hợp pháp của chức năng chính như là một mẫu chức năng

template <typename T = void> 
int main(int argc, char **argv) 
{ 
} 

và nhận được lỗi sau.

error: 'main' cannot be a template 
int main(int argc, char **argv) 
    ^

Có ai biết phần nào của tiêu chuẩn cấm điều này và văn bản có liên quan không?

+0

Bất kể những gì tiêu chuẩn nói, làm thế nào để bạn mong đợi người liên kết biết rằng 'chính ' là điểm vào của bạn? –

+0

Trong bài viết ban đầu của tôi, tôi đã không chính xác nói rằng tôi đã sử dụng clang 2.0, khi cần phải nói clang 2.9. Tôi đã sửa chữa nó. –

+0

@ DennisZickefoose - Vâng, tôi đã hy vọng rằng thực tế rằng nó được đặt tên là 'main' sẽ là một gợi ý. Rõ ràng là '' có vấn đề, nhưng vì đây là mẫu hàm, nên chúng ta có thể sửa đổi nó một số để sử dụng suy luận kiểu để nó có thể được gọi mà không có mẫu goo rõ ràng. –

Trả lời

15

Vâng, làm thế nào về vấn đề này (3.6.1):

Một chương trình phải có một chức năng toàn cầu gọi là chính, mà là sự bắt đầu chỉ định của chương trình. [...] Chức năng này sẽ không bị quá tải. Nó sẽ có kiểu trả về kiểu int, nhưng nếu không thì kiểu của nó sẽ được định nghĩa thực hiện.

Vì mẫu không hoạt động, tôi không nghĩ bạn có bất kỳ lựa chọn nào trong vấn đề. Cụ thể, hàm phải là main, không phải là main<> như trong ví dụ của bạn; và main của bạn không phải là một chức năng, mà là một mẫu, loại trừ sự tồn tại của một chức năng khác được gọi là main.

+1

Tôi không biết, tiêu chuẩn đôi khi nói rằng các chức năng chuyên môn mẫu chức năng là các chức năng. 14.5.6/1 "Một mẫu hàm xác định một tập hợp các hàm liên quan không bị chặn". 14.5.6.1/2 "Các chuyên môn như vậy là các chức năng riêng biệt và không vi phạm quy tắc định nghĩa một." – aschepler

+5

@aschepler: không nghi ngờ gì, nhưng những chức năng đó được gọi là 'chính 'và' chính 'vv, chứ không phải' chính'. Tất cả các mẫu tạo thành một gia đình không có liên quan của các loại có liên quan, nhưng các loại đó khác biệt với chính mẫu đó. –

+0

@KerrekSB - Vâng, tôi nghĩ trong tình huống này, thực tế là những gì tôi viết là một mẫu chức năng, không phải chức năng nào là quan trọng. Xem http://stackoverflow.com/questions/1117755/what-is-the-difference-between-function-template-and-template-function –

-7

Mẫu chức năng phải được khai báo trong tệp .h.

+4

...... Nói ai? – dreamlax

+1

Ngay cả khi điều đó là đúng, nó sẽ không trả lời câu hỏi. –

+1

Bộ tiền xử lý không biết gì về các mẫu. Khi nó được đưa vào lexer, tất cả những gì quan trọng là việc khai báo và định nghĩa mẫu phải nằm trong cùng một đơn vị dịch thuật. –

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