Erreurs, bugs, questions - page 2663

 
Aleksey Vyazmikin:

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...
 
Alexey Kozitsyn:
Impossible de s'engager sur un stockage...

Ça marche déjà, je crois.

 
Artyom Trishkin:

Ça marche déjà, je crois.

Oui.

 
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{};
   
void OnStart(){    
   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 template
   template<typename TT>
   TT test_real(TT p){
      TT b = NULL;
      PRINT(typename(TT));       
      PRINT(typename(b));        
      return b;
   }
};

class B{};
class C : public B{};

   
void OnStart(){  
   A<B> a; 
   B b;
   C c;
    
   C* c_ptr = a.test(&c);
}
 
Le bogue MT5 (build 2345) manque d'encapsulation lorsqu'on travaille avec des méthodes de classes de modèles :

class B{
private:
   template<typename T>
   void you_cannot_call_private_method(T n){
      printf("Wow, Nice job.");
   }
};
   
void OnStart(){  
   B b;   
   b.you_cannot_call_private_method(1);          // Wow, Nice job.
}
 
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 != NULL
      
      virtual_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){}
};

   
void OnStart(){  
   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...
 

Quelqu'un l'a-t-il compilé ?

class B {};

template<typename T>
class A
{
    static T *array;
    
    static void check()
    {
      T *ptr = array; // unresolved static variable 'A<B>::array'
    }
};

class Y: public A<B>
{
};

template<typename T>
static T *A::array;

void OnStart()
{
  Y y;
}

Qu'est-ce qu'il y a de mal à ça ?

 
Stanislav Korotky:

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;
    
    static void check(){
      T *ptr = array; 
    }
};

template<typename T>
static T *A::array;

class Y: public A<B>
{
};

void OnStart()
{
  Y y;
}
la définition du tableau statique a été déplacée au-dessus de la création de la classe Y.
Raison: