J'ai un cas difficile - il n'y a aucune logique à ma disposition.
Il existe une fonction avec ces entrées
Ainsi, cette fonction produit parfois une valeur de 769
Si vous décommentez la première impression
alors il donne la valeur correcte.
Si vous tronquez la fonction en supprimant uniquement le code qui n'est pas activé au moment où la fonction est appelée au moment de l'erreur, il n'y a pas non plus d'erreur.
Manifestement une erreur de compilateur - développeurs, à qui dois-je envoyer la fonction complète, elle ne tient pas sur le forum.
Je l'ai fait par le biais du commutateur - tout fonctionne. Ce doit être le compilateur, alors.
Bug MT5 (build 2345), une autre manifestation du bug décrit précédemment, où un pointeur passé à une fonction template agit comme un pointeur de type de données pour certaines opérations et comme une classe de type de données pour d'autres :
#define PRINT(x) ; Print(#x, ":", string(x))
template<typename T>
T test(T ptr){
PRINT(typename(ptr)); // A*
PRINT(typename(T)); // A*T new_ptr = new T();return (new_ptr);
}
class A{};
voidOnStart(){
A a;
test(&a); // Compile Error: OK
}
Bogue MT5 (build 2345), pas de vérification des noms de type de modèle réutilisés lors de la déclaration d'une fonction de modèle à l'intérieur d'une classe de modèle, conduisant à un comportement inattendu :
#define PRINT(x) ; Print(#x, ":", string(x))
template<typename T>class A{
public:
template<typename T>// Compile Error: OK
T test(T p){
B b = NULL;
PRINT(typename(B)); // C*
PRINT(typename(b)); // C*return b;
}
//real templatetemplate<typename TT>
TT test_real(TT p){
TT b = NULL;
PRINT(typename(TT));
PRINT(typename(b));
return b;
}
};
class B{};
class C : public B{};
voidOnStart(){
A<B> a;
B b;
C c;
C* c_ptr = a.test(&c);
}
Bug MT5 (build 2345) dans le constructeur de la classe de base, vous ne pouvez pas effectuer un typecast explicite pour transférer un pointeur vers un objet d'une classe de base vers un pointeur vers une classe parent.
#define PRINT(x) ; Print(#x, ":", string(x))
template<typename T>
class A{
T* virtual_call;
public:
A(T* ptr){
virtual_call = dynamic_cast<T*>(&this);
PRINT(virtual_call == NULL); // true, virtual_call == NULL
virtual_call = dynamic_cast<T*>(ptr);
PRINT(virtual_call == NULL); // false, virtual_call != NULLvirtual_call = (T*)(&this); // Execution Error: Incorrect casting of pointers.
virtual_call = (T*)(ptr); // OK
}
template<typename TT>
void test(TT n){
virtual_call.__test(n);
}
template<typename TT>
void __test(TT n){
printf("AAAA");
}
};
class B : public A<B>{
public:
B() : A(&this){}
template<typename TT>
void __test(TT n){
printf("BBBB");
}
};
class C : public A<C>{
public:
C() : A(&this){}
};
voidOnStart(){
B b;
b.test(1); // should be "BBBB"
C c;
c.test(1); // should be "AAAA"
}
Il s'avère que pour implémenter l'émulation "pattern" des fonctions template virtuelles, il est nécessaire de tirer la valeur directe du pointeur vers la classe parent dans la classe de base en plus de l'héritage de type, ce qui n'est pas bon...
class B {};
template<typename T>
class A
{
static T *array;
staticvoid check()
{
T *ptr = array; // unresolved static variable 'A<B>::array'
}
};
class Y: public A<B>
{
};
template<typename T>
static T *A::array;
voidOnStart()
{
Y y;
}
Quelqu'un l'a-t-il compilé ? Qu'est-ce qu'il y a de mal à ça ?
C'est bon, revenez pour en savoir plus :
class B {};
template<typename T>
class A
{
static T *array;
staticvoid check(){
T *ptr = array;
}
};
template<typename T>
static T *A::array;
class Y: public A<B>
{
};
voidOnStart()
{
Y y;
}
la définition du tableau statique a été déplacée au-dessus de la création de la classe Y.
J'ai un cas difficile - il n'y a aucune logique à ma disposition.
Il existe une fonction avec ces entrées
Ainsi, cette fonction produit parfois une valeur de 769
Si vous décommentez la première impression
alors il donne la valeur correcte.
Si vous tronquez la fonction en supprimant uniquement le code qui n'est pas activé au moment où la fonction est appelée au moment de l'erreur, il n'y a pas non plus d'erreur.
Manifestement une erreur de compilateur - développeurs, à qui dois-je envoyer la fonction complète, elle ne tient pas sur le forum.
Je l'ai fait par le biais du commutateur - tout fonctionne. Ce doit être le compilateur, alors.
Impossible de s'engager sur un stockage...
Ça marche déjà, je crois.
Ça marche déjà, je crois.
Oui.
Bogue MT5 (build 2345), pas de vérification des noms de type de modèle réutilisés lors de la déclaration d'une fonction de modèle à l'intérieur d'une classe de modèle, conduisant à un comportement inattendu :
Il s'avère que pour implémenter l'émulation "pattern" des fonctions template virtuelles, il est nécessaire de tirer la valeur directe du pointeur vers la classe parent dans la classe de base en plus de l'héritage de type, ce qui n'est pas bon...
Quelqu'un l'a-t-il compilé ?
Qu'est-ce qu'il y a de mal à ça ?
Quelqu'un l'a-t-il compilé ?
Qu'est-ce qu'il y a de mal à ça ?
C'est bon, revenez pour en savoir plus :
la définition du tableau statique a été déplacée au-dessus de la création de la classe Y.