2010-03-18 12 views
14
void foo() { 
    struct Foo { .. }; 
    std::vector<Foo> vec; // why is this illegal? 
} 

No regresaré a Foo al mundo exterior. Es solo un tipo temporal que uso dentro de la función.¿Por qué un std :: vector no puede tomar un tipo local?

+0

+1 ¡Buena pregunta! Nunca he oído hablar de eso =) – SadSido

+0

@anon: ¿Puedo saber qué compilador usaste? – jasonline

+0

@anon: podría compilarlo en Visual C++ 2005, pero supongo que esto no sigue el estándar si realmente se menciona allí. – jasonline

Respuesta

14

Una clase local no puede ser un argumento de plantilla. Debido a que la norma dice: -

14.3.1 párrafo 2: "Un tipo de locales, un tipo sin vinculación, un tipo sin nombre o un tipo compuesto de cualquiera de estos tipos no deberá ser utilizado como un argumento de plantilla para un parámetro de tipo de plantilla ".

[Example: 
template <class T> class X { /* ... */ }; 
void f() 
{ 
struct S { /* ... */ }; 
X<S> x3; // error: local type used as templateargument 
X<S*> x4; // error: pointer to local type used as templateargument 
} 
-end example] [Note: a template type argument may be an incomplete 
type (3.9). ]" 

Una solución alternativa se sugiere here en c.l.C++. Moderado.

ACTUALIZACIÓN: Hubo alguna discusión sobre por qué no es posible tener clases locales como argumentos de plantilla? Los enlaces here y here en c.std.C++ discuten lo mismo.

3

Respuesta corta: Debido a que el estándar de C++ lo indique (sección 14.3.1)

Respuesta larga: En el momento en que C++ fue estandarizada, el comité de estándares de C++ creían que no habría aplicación y rendimiento cuestiones. Esos miedos resultaron ser infundados y, a partir del borrador final del estándar C++ 0x, han revertido la decisión.


En un plano más práctico, algunos compiladores ya son compatibles con las nuevas reglas de C++ 0x:

  • para MacOSX que necesita gcc> = 4.5 con el parámetro de línea de comandos -std=c++0x
  • Para el compilador Microsoft que necesita> = VC8/VS2005 sin los /Za de opción (extensiones de lenguaje incapacitadas)
Cuestiones relacionadas