2012-03-07 16 views
11

Estoy intentando asignar un tamaño fijo en la pila a una matriz de enterosCómo convertir int a const int para asignar el tamaño de la matriz en la pila?

#include<iostream> 
using namespace std; 

int main(){ 

    int n1 = 10; 
    const int N = const_cast<const int&>(n1); 
    //const int N = 10; 
    cout<<" N="<<N<<endl; 
    int foo[N]; 
    return 0; 
} 

Sin embargo, esto da un error en la última línea donde estoy usando N para definir un fijo
error C2057: expected constant expression.

Sin embargo, si defino N como const int N = 10, el código se compila muy bien. ¿Cómo debo escribir n1 para tratárselo como const int?

Intenté:const int N = const_cast<const int>(n1) pero eso da error.

EDIT: Estoy usando MS VC++ 2008 para compilar esto ... con g ++ compila bien.

Respuesta

17

¿Cómo debo escribir n1 para tratarlo como const int?

No puede, no para este propósito.

El tamaño de la matriz debe ser lo que se llama Expresión constante integral (ICE). El valor debe ser computable en tiempo de compilación. Se puede usar un const int (u otro objeto de tipo entero const), en una Expresión Constante Integral solo si se inicializa con una Expresión Constante Integral.

Un objeto no const (como n1) no puede aparecer en ninguna parte en una expresión constante integral.

¿Ha considerado usar std::vector<int>?

[Nota: el lanzamiento es completamente innecesario. Ambos de los siguientes son tanto exactamente la misma:

const int N = n1; 
const int N = const_cast<const int&>(n1); 

--End Nota]

+2

sólo para añadir un detalle más: gcc compila como una extensión - de hecho, que permite a otras expresiones que ni siquiera son tan cerca de conformarse, como 'int x (int a) {int b [a]; } ' –

+0

Ah, gracias, @JerryCoffin. No vi la edición cuando publiqué. –

3

Sólo las matrices de tamaño fijo se pueden asignar esa manera. Asigne memoria dinámicamente (int* foo = new int[N];) y elimínela cuando termine, o (preferiblemente) use std::vector<int> en su lugar.

(Edit: GCC accepts that as an extension, pero no es parte del estándar C++.)