2012-01-20 14 views
12

que estoy haciendo algo como estostatic const + const como una matriz ligada

Class.hpp:

class Class { 

private: 
    static const unsigned int arraySize; 
    int ar[arraySize+2]; 
}; 

Class.cpp:

#include <Class.hpp> 
const unsigned int arraySize = 384; 

El compilador (q ++, una compilador de C++ para el sistema operativo QNX basado en g ++) me da error: array bound is not an integer constant al compilar una unidad que incluye Class.hpp (no al compilar Class.cpp).

¿Por qué no funciona? Sé que un miembro de estást estático se puede usar como un conjunto de matrices, garantizado por el estándar de C++ (ver this anwser). ¿Pero por qué el compilador no ve el resultado de static const + const como una constante?

+1

Compila bien para mí (gcc 4.6.1), como debería. ¿Probablemente un error en ese compilador? –

+0

He actualizado mi ejemplo para que coincida mejor con mi código real. Tal vez hay un problema con la declaración forward de arraySize? – MBober

+1

Consulte aquí: [DR # 721] (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#721). Siempre se pretendía (y en C++ 11 es explícitamente el caso) que el inicializador para la constante debería ser visible en el punto en el que el miembro de datos estáticos o la variable constante se usó para calificar como una expresión constante. –

Respuesta

12

Este es un buen código que debería haber sido aceptado por el compilador:

class Class { 
    const static int arraySize = 384; 
    int ar[arraySize+2]; 
}; 

y si no lo es, el compilador está roto.

Sin embargo, si mueve la constante real fuera del archivo de encabezado a la unidad de traducción seleccionada, eso invalidará el código.

// Class.h 
class Class { 
    const static int arraySize; 
    int ar[arraySize+2]; // ERROR 
}; 

// Class.cpp 
const int Class::arraySize = 384; 

Esto es debido a que el tamaño de su objeto Class no se puede determinar en tiempo de compilación de los datos disponibles en la cabecera solo. Esto no es exactamente razón correcta, pero el razonamiento a lo largo de estas líneas ayuda a comprender los errores de compilación como este.

Para evitar cometer estos errores, puede reemplazar static const int con un enum, p. Ej.

class Class { 
    enum { arraySize = 384 }; 
    int ar[arraySize+2]; 
}; 
+0

Gracias por la solución. Lo sabía yo mismo. Pero es importante para mí comprobar si este es un código C++ válido. Si tiene razón, entonces podríamos completar una queja contra la compañía que nos vendió el compilador. – MBober

+0

Oh, cambiaste el código en tu pregunta. Alejarse constantemente del encabezado cambia completamente las cosas. Actualizaré mi respuesta para evitar engañar a los demás. – bronekk

+0

Gracias. Perdón por la confusion. – MBober

2

Me sorprende que en realidad compila en gcc, como dice un comentario. Como el 384 no está en el archivo de encabezado, otras unidades de compilación no conocen el tamaño del Class. Que no podría ser importante en algunas unidades de compilación en función de cómo/si están utilizando Class, pero no puedo imaginar que esta compilación:

// this is a source file called, say, blah.cpp 
#include <Class.hpp> 

void someFunc() 
{ 
    void *mem = malloc(sizeof(Class)); // size is not known, so this can't compile 

    // do something with mem 
} 

Es necesario tener en su .hpp:

class Class { 

private: 
    static const unsigned int arraySize = 384; 
    int ar[arraySize+2]; 
}; 

.. como está en el OP que enlaza al here.

+0

OP cambiar la pregunta. Originalmente, la constante se definió en el encabezado. – avakar

+0

Los comentarios se refieren a una versión anterior del código de ejemplo en mi pregunta. Sin embargo, si estoy definiendo mi const estático directamente en el encabezado, se compila bien. Entonces puedes editar tu respuesta y yo la aceptaré. :) – MBober

+0

MBober solo puede aceptar una respuesta. – CashCow

Cuestiones relacionadas