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?
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?
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.
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:
-std=c++0x
/Za
de opción (extensiones de lenguaje incapacitadas)
+1 ¡Buena pregunta! Nunca he oído hablar de eso =) – SadSido
@anon: ¿Puedo saber qué compilador usaste? – jasonline
@anon: podría compilarlo en Visual C++ 2005, pero supongo que esto no sigue el estándar si realmente se menciona allí. – jasonline