2011-11-16 10 views
7

Na kaprys, starałem się określić główną funkcję jako funkcję szablonu przy użyciu szczęk 2.9:Potrzebujesz zacytować standardowy o legalności głównej funkcji jako funkcji szablonu

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

i otrzymała następujący błąd.

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

Czy ktoś wie, co sekcja normy zabrania tego i jaki jest odpowiedni tekst?

+0

Niezależnie od tego, co mówi standard, jak można się spodziewać, że linker dowie się, że 'główny ' jest twoim punktem wejścia? –

+0

W moim oryginalnym wpisie niepoprawnie stwierdziłem, że używałem clang 2.0, kiedy powinienem powiedzieć klang 2.9. Od tego czasu to poprawiłem. –

+0

@DennisZickefoose - Cóż, miałem trochę nadziei, że fakt, że nazwa ta została nazwana 'main' będzie wskazówką. Oczywiście "" jest problematyczne, ale ponieważ jest to szablon funkcji, każdy inny przypadek możemy zmodyfikować, aby użyć inferencji typu, tak aby można było go wywołać bez jawnego szablonu goo. –

Odpowiedz

15

Cóż, jak na ten temat (3.6.1):

Program powinien zawierać globalną funkcję o nazwie główny, który jest wyznaczony początek programu. [...] Ta funkcja nie może być przeciążona. Musi mieć typ zwracany typu int, ale poza tym jego typ jest definiowany przez implementację.

Ponieważ szablony nie są funkcjami, nie sądzę, aby mieli Państwo wybór. W szczególności funkcja musi być main, a nie main<>, jak w twoim przykładzie; a twoja main nie jest funkcją, ale szablonem, co wyklucza istnienie innej funkcji o nazwie main.

+1

Nie wiem, Standard czasami mówi, że specjalizacje szablonu funkcji są funkcjami. 14.5.6/1 "Szablon funkcji definiuje nieograniczony zestaw powiązanych funkcji." 14.5.6.1/2 "Takie specjalizacje są odrębnymi funkcjami i nie naruszają zasady jednej definicji." – aschepler

+5

@spróbować: bez wątpienia, ale te funkcje są nazywane 'główne ' i 'główne ' itp., A nie 'główne'. Wszystkie szablony stanowią nieograniczoną rodzinę powiązanych typów, ale te typy różnią się od samego szablonu. –

+0

@KerrekSB - Tak, myślę, że w tej sytuacji ważne jest to, co napisałem, to szablon funkcji, a nie funkcja. Zobacz http://stackoverflow.com/questions/1117755/what-is-the-difference-between-function-template-and-template-function –

-7

Szablony funkcji muszą być zadeklarowane w pliku .h.

+4

...... Mówi kto? – dreamlax

+1

Nawet gdyby to była prawda, nie odpowiedziałaby na pytanie. –

+1

Preprocesor nie wie nic o szablonach. Kiedy dochodzi do lexera, liczy się tylko to, że deklaracja i definicja szablonu musi znajdować się w tej samej jednostce tłumaczeniowej. –