Errores, fallos, preguntas - página 2663

 
Tiene un grave fallo en el cálculo de las bolsas y no le importa, y no está claro si el problema pasa desapercibido a propósito o accidentalmente
 
Aleksey Vyazmikin:

Tengo un caso difícil - no hay lógica disponible para mí.

Hay una función con estas entradas

Por lo tanto, esta función a veces produce un valor de 769

Si se descomenta la primera impresión

entonces da el valor correcto.

Si se trunca la función eliminando sólo el código que no está activado en el momento en que se llama a la función en el momento del error, tampoco hay error.

Obviamente es un error del compilador - desarrolladores, a quién debo enviar la función completa, no cabe en el foro.

Lo hice a través de switch - todo funciona. Debe ser el compilador, entonces.

 
No se puede comprometer a un almacenamiento...
 
Alexey Kozitsyn:
No se puede comprometer a un almacenamiento...

Creo que ya está funcionando.

 
Artyom Trishkin:

Creo que ya está funcionando.

Sí.

 
Error en MT5 (build 2345), otra manifestación del error descrito anteriormente, donde un puntero pasado a una función de plantilla actúa como puntero de tipo de datos para algunas operaciones y como clase de tipo de datos para otras:

#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
}
 

Bug MT5 (build 2345), no se comprueba la reutilización de nombres de tipos de plantillas al declarar una función de plantilla dentro de una clase de plantilla, lo que provoca un comportamiento inesperado:

#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);
}
 
Bug MT5 (build 2345) carece de encapsulación cuando se trabaja con métodos de clases de plantillas:

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.
}
 
Error en MT5 (build 2345) en el constructor de la clase base, no se puede realizar un typecast explícito para lanzar un puntero a un objeto de una clase base a un puntero a una clase padre.

#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"
}

Resulta que para implementar la emulación del "patrón" de las funciones virtuales de plantilla es necesario tirar del valor directo del puntero a la clase padre en la clase base además de la herencia de tipos, lo que no es bueno...
 

¿Alguien tiene esto compilado?

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é tiene de malo?