Especificación en tiempo de compilación del tamaño del arreglo en C++
Estoy intentando crear una estructura para contener una cabecera de archivo dentro de la sección de declaraciones de una clase en un archivo de cabecera. Esto implica el cálculo de un valor que se conoce en tiempo de compilación y quiero usarlo para dimensionar un array dentro de la cabecera.
Este es un extracto de un archivo de cabecera de lo que he estado intentando recientemente:
const uint hFreeSiz = (1024 - sizeof(uint32_t) - sizeof (uint16_t)- sizeof (uint16_t) - sizeof(RId))/sizeof (RId);
template <const uint freedSiz>
struct FBHead
{
/** Un número mágico para el archivo. Indica tanto la clase como la versión. */
uint32_t fSig;
/** El número de bytes de datos dentro de cada bloque. */
uint16_t blkSize;
/** El número de registros disponibles para su reutilización. */
uint16_t freedCnt;
/** El número de identificación del último registro escrito en el archivo. */
RId lstRec;
RId freedRecs[freedSiz];
};
FBHead<hFreeSiz> fbHead;
pero me dice:
error: uso no válido del miembro de datos no estático ‘FBFile::hFreeSiz’
Podría calcular esto manualmente, pero estoy tratando de entender qué está pasando aquí y por qué no funciona. ¿Alguien puede explicarlo? (Supongo que si moviera la declaración constante fuera de la clase, funcionaría, pero preferiría mantenerla cerca de las cosas que se utilizan para modificarla. De hecho, si esa es la única respuesta, probablemente calcule a mano y agregue comentarios sobre por qué ese número en particular).
davy.ai
El mensaje de error indica que la declaración de
hFreeSiz
dentro del template de la estructura se está tratando como un miembro de dato no estático en lugar de una expresión constante. Esto significa que no se conoce en tiempo de compilación y no se puede utilizar para dimensionar un arreglo.Una solución es mover la declaración de
hFreeSiz
fuera del template de la estructura y definirla como una constante global. Esto permitirá evaluarla en tiempo de compilación y usarla para dimensionar el arreglo dentro del template de la estructura.Alternativamente, puedes utilizar un enfoque diferente para calcular el tamaño del arreglo dentro del template de la estructura. Una opción es utilizar
std::array
con un tamaño fijo en lugar de un arreglo estilo C, y calcular ese tamaño utilizando una función constexpr.Por ejemplo, podrías definir la estructura de esta manera:
“`c++
struct FBHead {
static constexpr uint hFreeSiz = (1024 – sizeof(uint32_t) – sizeof(uint16_t) – sizeof(uint16_t) – sizeof(RId)) / sizeof(RId);
};
“`
Este enfoque utiliza una variable miembro estática constexpr para calcular el tamaño del arreglo en tiempo de compilación, y
std::array
para asegurar que el tamaño sea fijo y no pueda ser cambiado en tiempo de ejecución.</rid,>