2011-11-16 9 views
7

En un capricho, he tratado de definir la función principal como una función de plantilla mediante tañido 2.9:Necesita cita de norma sobre la legalidad de la función principal, como una función de plantilla

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

y recibe el siguiente error.

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

¿Alguien sabe qué sección de la norma prohíbe esto, y lo que el texto es relevante?

+0

Independientemente de lo que diga la norma, ¿cómo espera que el vinculador sepa que 'main ' es su punto de entrada? –

+0

En mi publicación original, dije incorrectamente que estaba usando clang 2.0, cuando debería haber dicho clang 2.9. Desde entonces he corregido eso. –

+0

@DennisZickefoose - Bueno, tenía la esperanza de que el hecho de que se llamara 'main' sería una pista. Obviamente, el '' es problemático, pero como se trata de una plantilla de función, en cualquier otro caso podríamos modificarlo para usar la inferencia de tipo para que pueda invocarse sin la plantilla explícita goo. –

Respuesta

15

Bueno, ¿qué tal esto (3.6.1):

Un programa debe contener una función global llamada principal, que es el inicio designada del programa. [...] Esta función no debe estar sobrecargada. Tendrá un tipo de retorno de tipo int, pero de lo contrario su tipo está definido por la implementación.

Dado que las plantillas no son funciones, no creo que tenga otra opción en la materia. En particular, la función tiene que ser main, no main<> como en su ejemplo; y su main no es una función, sino una plantilla, que impide la existencia de otra función llamada main.

+1

No sé, el estándar a veces dice que las especializaciones de plantillas de funciones son funciones. 14.5.6/1 "Una plantilla de función define un conjunto ilimitado de funciones relacionadas." 14.5.6.1/2 "Dichas especializaciones son funciones distintas y no violan la regla de una definición". – aschepler

+5

@aschepler: sin duda, pero esas funciones se llaman 'main ' y 'main ' etc, y no 'main'. Todas las plantillas constituyen una familia ilimitada de tipos relacionados, pero esos tipos son distintos de la plantilla misma. –

+0

@KerrekSB - Sí, creo que en esta situación, el hecho de que lo que he escrito es una plantilla de función, no es una función importante. Consulte http://stackoverflow.com/questions/1117755/what-is-the-difference-between-function-template-and-template-function –

-7

Las plantillas de función se deben declarar en el archivo .h.

+4

...... ¿Dice quién? – dreamlax

+1

Incluso si eso fuera cierto, no respondería la pregunta. –

+1

El preprocesador no sabe nada sobre las plantillas. Cuando llega al lexer, todo lo que importa es que la declaración y la definición de la plantilla deben estar en la misma unidad de traducción. –

Cuestiones relacionadas