Bonjour à tous
Voici le code que je voudrais que l'on regarde :
Tel quel, le code compile bien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 #include <iostream> #include <tr1/array> /// On Mac ///#include <array> /// On other system class une_classe { public: une_classe(int a, int b):_x(a),_y(b){}; void foo(); protected: const int _x,_y; }; void une_classe::foo(){ std::cout << "bla" << std::endl; //std::tr1::array<int, _x> vec; // <----------- } int main( int argc, char* argv[] ){ std::tr1::array<int, 10> a; const int N(10); std::tr1::array<int, N> b; std::cout << "Hello world!" << std::endl; une_classe obj(10,10); obj.foo(); return 0; }
Dans le main on créer 2 arrays puis un objet de la classe que l'on a définie.
La fonction foo() ne fait qu'afficher "bla".
Si maintenant je veux faire qqch de plus avancé avec ma fonction foo(), admettons qu'à l'intérieur de cette méthode, j'ai besoin d'un array d'entier dont la taille serait l'attribut _x de mon objet.
Je décommente la ligne mise en évidence dans cette fonction.
Et là erreur :
(edit: Le curseur ^~ pointe sur _x, mais les espaces multiples ne semblent pas être affichés correctement)array.cpp:19:23: error: non-type template argument of type 'int' is not an integral constant expression
std::tr1::array<int, _x> vec;
^~
1 error generated.
J'ai essayé de rajouter un cast int-->size_t, mais visiblement il est effectué par défaut vu que le message d'erreur reste le même.
Pourquoi est-ce que j'obtiens cette erreur?
Comment puis-je m'en débarrasser?
Je pourrais certes utiliser un std::vector au lieu d'un std::tr1::array mais le parcours et l'extraction sont plus coûteux non?
Merci de votre aide
lg_53
Partager