2011-11-16 10 views
7

Per un capriccio, ho cercato di definire la funzione principale come una funzione modello utilizzando clang 2.9:Hai bisogno di citare dal livello di legalità della funzione principale, come una funzione template

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

e ha ricevuto il seguente errore.

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

Qualcuno sa quale sezione dello standard lo vieta e qual è il testo pertinente?

+0

Indipendentemente da ciò che dice lo standard, come ti aspetti che il linker sappia che 'main ' è il tuo punto di ingresso? –

+0

Nel mio post originale, ho dichiarato erroneamente che stavo usando clang 2.0, quando avrebbe dovuto dire clang 2.9. Da allora l'ho corretto. –

+0

@DennisZickefoose - Beh, stavo sperando che il fatto che fosse chiamato "main" sarebbe un suggerimento. Ovviamente il '' è problematico, ma dal momento che questo è un modello di funzione, in qualsiasi altro caso potremmo modificarlo per usare l'inferenza del tipo in modo che possa essere chiamato senza il goo template esplicito. –

risposta

15

Beh, che ne dite di questo (3.6.1):

Un programma deve contenere una funzione globale chiamato principale, che è l'inizio designato del programma. [...] Questa funzione non deve essere sovraccaricata. Deve avere un tipo di ritorno di tipo int, ma in caso contrario il suo tipo è definito dall'implementazione.

Poiché i modelli non sono funzioni, non penso che tu abbia altra scelta in merito. In particolare, la funzione deve essere main, non main<> come nell'esempio; e il tuo main non è una funzione, ma un modello, precludendo l'esistenza di un'altra funzione denominata main.

+1

Non so, lo Standard a volte dice che le specializzazioni del modello di funzione sono funzioni. 14.5.6/1 "Un modello di funzione definisce un insieme illimitato di funzioni correlate." 14.5.6.1/2 "Tali specializzazioni sono funzioni distinte e non violano l'unica regola di definizione." – aschepler

+5

@aschepler: senza dubbio, ma quelle funzioni sono chiamate 'main ' e 'main ' ecc, e non 'main'. Tutti i modelli costituiscono una famiglia illimitata di tipi correlati, ma questi tipi sono distinti dal modello stesso. –

+0

@ KerrekSB - Sì, penso che in questa situazione, il fatto che quello che ho scritto sia un modello di funzione, non una funzione è importante. Vedi http://stackoverflow.com/questions/1117755/che-è-la-differenza-della-funzione-template-e-template-function –

-7

I modelli di funzione devono essere dichiarati nel file .h.

+4

...... dice chi? – dreamlax

+1

Anche se fosse vero, non risponderebbe alla domanda. –

+1

Il preprocessore non conosce nulla dei modelli. Quando arriva al lexer, tutto ciò che conta è che la dichiarazione e la definizione del modello devono essere nella stessa unità di traduzione. –

Problemi correlati