template<typename ValueType>
void GetValueType(ValueType * value){
if (content->GetType() =3D=3D typeid(ValueType)) // content->type()
plantage appel de fonction pure
*value =3D static_cast<TypeValue<ValueType>*>(content)->Value;
// else
// wxASSERT(false);
}
BaseValue* content;
};
int main()
{
int Entier;
double Reel;
RefAny hTemp(3.14);
hTemp.GetValue(&Reel);
hTemp =3D 345;
hTemp.GetValue(&Entier);
hTemp =3D 784;
hTemp.GetValueType(&Entier); // --> plantage appel de fonction pure
hTemp.GetValueType(&Reel); // --> plantage appel de fonction pure
std::cout << "Appuyer sur une touche..." << endl;
_getch();
}
content->GetType() devrait faire un appel =E0 la m=E9thode GetType() de
TypeValue mais produit soit un plantage soit un appel de fonction pure
de BaseValue
Je pense que le probl=E8me doit venir de l'utilisation de template, mais
j'aimerais bien comprendre...
Ceci ne compile pas. Tu crées un objet temporaire "TypeValue<ValueType>(value)", et tu mets son adresse dans un pointeur membre. Ça n'a pas de sens, puisque l'objet sera détruit immédiatement.
Je ne sais pas bien ce que tu veux faire, mais pour que ça ait un tant soit peu de sens, il faudrait écrire :
Ceci ne compile pas.
Tu crées un objet temporaire "TypeValue<ValueType>(value)", et tu mets
son adresse dans un pointeur membre. Ça n'a pas de sens, puisque
l'objet sera détruit immédiatement.
Je ne sais pas bien ce que tu veux faire, mais pour que ça ait un tant
soit peu de sens, il faudrait écrire :
Ceci ne compile pas. Tu crées un objet temporaire "TypeValue<ValueType>(value)", et tu mets son adresse dans un pointeur membre. Ça n'a pas de sens, puisque l'objet sera détruit immédiatement.
Je ne sais pas bien ce que tu veux faire, mais pour que ça ait un tant soit peu de sens, il faudrait écrire :
: content (new TypeValue<ValueType>(value))
shaman
Merci pour votre aide, effectivement j'ai zappé la création de cette variable temporaire, mais ce qui est étonnant dans cette erreur c'est que visual studio ne la pas signalée et que le plantage se produise après les appels hTemp.GetValue(&Reel);et de hTemp.GetValue(&Entier); qui fonctionne !!! sur une variable qui aurait du déjà être détruite à ce moment... Le fait que cette variable n'est pas détruite immédiatement génère des erreurs à des endroits différents (bonjour la prise de tête).
Merci pour votre aide, effectivement j'ai zappé la création de cette
variable temporaire, mais ce qui est étonnant dans cette erreur c'est
que visual studio ne la pas signalée et que le plantage se produise
après les appels hTemp.GetValue(&Reel);et de hTemp.GetValue(&Entier);
qui fonctionne !!! sur une variable qui aurait du déjà être
détruite à ce moment... Le fait que cette variable n'est pas
détruite immédiatement génère des erreurs à des endroits
différents (bonjour la prise de tête).
Merci pour votre aide, effectivement j'ai zappé la création de cette variable temporaire, mais ce qui est étonnant dans cette erreur c'est que visual studio ne la pas signalée et que le plantage se produise après les appels hTemp.GetValue(&Reel);et de hTemp.GetValue(&Entier); qui fonctionne !!! sur une variable qui aurait du déjà être détruite à ce moment... Le fait que cette variable n'est pas détruite immédiatement génère des erreurs à des endroits différents (bonjour la prise de tête).
Fabien LE LEZ
On 2 Dec 2005 12:21:11 -0800, "shaman" :
mais ce qui est étonnant dans cette erreur c'est que visual studio ne la pas signalée
VC++ présente là manifestement un comportement douteux. Je ne sais pas en revanche si c'est étonnant. Quelle version as-tu ?
Je te conseille d'avoir un deuxième compilo (Comeau par exemple) pour tester ton code.
et que le plantage se produise après les appels
Non, ça c'est normal : il s'agit de ce qu'on appelle un "comportement indéfini" -- la norme ne prévoit pas ce qui va se passer, et effectivement on a un plantage à un endroit bizarre, éventuellement aléatoire.
On 2 Dec 2005 12:21:11 -0800, "shaman" <spam.eric@free.fr>:
mais ce qui est étonnant dans cette erreur c'est
que visual studio ne la pas signalée
VC++ présente là manifestement un comportement douteux. Je ne sais pas
en revanche si c'est étonnant.
Quelle version as-tu ?
Je te conseille d'avoir un deuxième compilo (Comeau par exemple) pour
tester ton code.
et que le plantage se produise après les appels
Non, ça c'est normal : il s'agit de ce qu'on appelle un "comportement
indéfini" -- la norme ne prévoit pas ce qui va se passer, et
effectivement on a un plantage à un endroit bizarre, éventuellement
aléatoire.
mais ce qui est étonnant dans cette erreur c'est que visual studio ne la pas signalée
VC++ présente là manifestement un comportement douteux. Je ne sais pas en revanche si c'est étonnant. Quelle version as-tu ?
Je te conseille d'avoir un deuxième compilo (Comeau par exemple) pour tester ton code.
et que le plantage se produise après les appels
Non, ça c'est normal : il s'agit de ce qu'on appelle un "comportement indéfini" -- la norme ne prévoit pas ce qui va se passer, et effectivement on a un plantage à un endroit bizarre, éventuellement aléatoire.
shaman
J'ai visual studio 2003, en fait il faut passer en warnings Niveau 4 (/W4) pour avoir ça : e:programmationSOURCE_dotnetconsoleArray_multi_typeArray_multi_type.h( 246) : warning C4238: extension non standard utilisée : classe rvalue utilisée comme lvalue main.cpp(552) : voir la référence à l'instanciation du modèle de fonction 'RefAny::RefAny<double>(const ValueType & )' en cours de compilation with [ ValueType=double ] e:programmationSOURCE_dotnetconsoleArray_multi_typeArray_multi_type.h( 246) : warning C4238: extension non standard utilisée : classe rvalue utilisée comme lvalue main.cpp(557) : voir la référence à l'instanciation du modèle de fonction 'RefAny::RefAny<int>(const ValueType & )' en cours de compilation with [ ValueType=int ] Donc c'est moi qui à tout faux(comme dab), et visual fonctionne parfaitement.
J'ai visual studio 2003, en fait il faut passer en warnings Niveau 4
(/W4) pour avoir ça :
e:programmationSOURCE_dotnetconsoleArray_multi_typeArray_multi_type.h( 246)
: warning C4238: extension non standard utilisée : classe rvalue
utilisée comme lvalue
main.cpp(552) : voir la référence à l'instanciation du
modèle de fonction 'RefAny::RefAny<double>(const ValueType & )' en
cours de compilation
with
[
ValueType=double
]
e:programmationSOURCE_dotnetconsoleArray_multi_typeArray_multi_type.h( 246)
: warning C4238: extension non standard utilisée : classe rvalue
utilisée comme lvalue
main.cpp(557) : voir la référence à l'instanciation du
modèle de fonction 'RefAny::RefAny<int>(const ValueType & )' en cours
de compilation
with
[
ValueType=int
]
Donc c'est moi qui à tout faux(comme dab), et visual fonctionne
parfaitement.
J'ai visual studio 2003, en fait il faut passer en warnings Niveau 4 (/W4) pour avoir ça : e:programmationSOURCE_dotnetconsoleArray_multi_typeArray_multi_type.h( 246) : warning C4238: extension non standard utilisée : classe rvalue utilisée comme lvalue main.cpp(552) : voir la référence à l'instanciation du modèle de fonction 'RefAny::RefAny<double>(const ValueType & )' en cours de compilation with [ ValueType=double ] e:programmationSOURCE_dotnetconsoleArray_multi_typeArray_multi_type.h( 246) : warning C4238: extension non standard utilisée : classe rvalue utilisée comme lvalue main.cpp(557) : voir la référence à l'instanciation du modèle de fonction 'RefAny::RefAny<int>(const ValueType & )' en cours de compilation with [ ValueType=int ] Donc c'est moi qui à tout faux(comme dab), et visual fonctionne parfaitement.