Duplicar posible:
Incomplete class usage in template¿Cuándo debe completarse un tipo utilizado como argumento de plantilla si se usa internamente en un contexto que requiere un tipo completo?
Tengo una pregunta que me ha sido desconcertante para un par de horas.
Al principio pensé que el tipo tendría que ser completa en el punto de instanciación, pero todos los compiladores que han intentado aceptar el tipo que aún estaba incompleta en ese momento, siempre que se define en cualquier lugar de la traducción unidad.
Para ilustrarlo, la cuestión es sobre la exactitud de este sencillo programa:
template <typename T>
int size() {
return sizeof(T); // T is required to be complete in this expression
}
class test; // test is declared, but incomplete
int main() {
size<test>();
}
// [1] point of instantiation of size<test>()
class test {}; // Definition of test, now it is complete
Según §14.6.4.1/1 el punto de instanciación de size<test>
es la línea marcada como [1], y en ese punto, el tipo test
aún está incompleto. Si hubiéramos intentado realizar la operación sizeof(test)
allí, el compilador habría fallado diciéndonos que el tipo está incompleto. Y aún llamando a una plantilla dentro de la cual el tipo para realizar esa misma operación exacta se compila en g ++, clang ++, comeau y Visual Studio 2010.
¿El código anterior es realmente correcto? ¿En qué parte del estándar admite que el tipo utilizado como argumento para la plantilla se considere completo si es completo en cualquier lugar de la misma unidad de traducción? ¿O cuando debe estar completo?
Pregunta muy similar: http://stackoverflow.com/questions/7210286 – aschepler
@aschepler: Creo que son exactamente las mismas, la única diferencia, así que he votado para cerrar. No lo estoy eliminando (aún) para * aumentar * su pregunta y ver si alguien responde con una respuesta (la única respuesta a su pregunta es un poco). Gracias por señalar el duplicado. –
@aschepler: definitivamente un duplicado, sin embargo, esta pregunta parece estar recibiendo más atención (la vida es injusta). Realmente me gustaría que nuestros estandaristas salten aquí. –