Dire que j'ai une classe « Code » défini comme celui-ci, avec une conversion de type défini par l'utilisateur type int:expression constante attendu échoue lamentablement dans l'instruction switch
class Code
{
public:
int code;
std::string description;
Code (const int c, const std::string& d) : code(c), description(d) { ; }
operator int() const { return code; }
};
Et une deuxième classe « Master » en utilisant la classe de code :
class Master
{
public:
Code master_code;
};
en plus d'un groupe de codes prédéfinis, comme ceci:
const Code CODE_ONE (1, "This is code one");
const Code CODE_TWO (2, "This is code two");
const Code CODE_THREE (3, "This is code three");
On penserait (c'est à dire. Je pense) que l'on pourrait l'utiliser comme ceci:
Master master_obj;
switch (master_obj.master_code)
{
case CODE_ONE:
// ...
break;
case CODE_TWO:
// ...
break;
case CODE_THREE:
// ...
break;
default:
// ...
}
en raison de la conversion automatique de type int, mais ce ne semble pas être le cas. GCC me dit que CODE_ONE, CODE_TWO et CODE_THREE "ne peuvent pas apparaître dans une expression constante".
Cela ne fonctionne pas non plus, par la voie:
Master master_obj;
switch (master_obj.master_code)
{
case CODE_ONE.code:
// ...
break;
case CODE_TWO.code:
// ...
break;
case CODE_THREE.code:
// ...
break;
default:
// ...
}
Les rendements ci-dessus exactement la même erreur: « 'CODE_ONE ne peuvent pas apparaître dans une expression constante » en plus d'un « ." ne peut pas apparaître dans une expression constante ".
Mais cela fonctionne:
Master master_obj;
switch (master_obj.master_code)
{
case 1:
// ...
break;
case 2:
// ...
break;
case 3:
// ...
break;
default:
// ...
}
Alors CODE_ONE etc. ne peut pas être résolu comme des expressions constantes? Cela semble bizarre ... Ou est-ce que je fais quelque chose de mal?
Oh bum. Eh bien, merci de clarifier alors. – Oystein
@oystein: Je devrais probablement ajouter que C++ 0x développe un peu l'idée des expressions constantes. Il ajoute 'constexpr', que vous pouvez utiliser pour marquer les choses comme des expressions constantes, donc avec quelque chose comme' int constexpr f() {return 1; } 'vous pouvez utiliser' f() 'comme une expression constante. –