Ошибки, баги, вопросы - страница 2663

 
У вас серьезный баг в расчетах на фондовых рынках, а вам плевать, причем непонятно целенаправленно или случайно эта проблема остается незамеченной
 
Aleksey Vyazmikin:

У меня тяжелый случай - логика, доступная мне, отсутствует.

Есть функция с такими входными

Так вот, эта Функция иногда выдает значение 769

если раскомментировать первый принт

то выдается правильное значение.

Если урезать функцию, убрав просто код, неактивирующийся в момент вызова функции в момент ошибки, то ошибки так же нет.

Явно ошибка компилятора - разработчики, кому послать полную функцию, а то на форуме она не умещается.

Сделал через switch - все работает. Значит в компиляторе дело.

 
Невозможно закоммитить в сторадж...
 
Alexey Kozitsyn:
Невозможно закоммитить в сторадж...

Уже заработал вроде.

 
Artyom Trishkin:

Уже заработал вроде.

Да.

 
Баг МТ5 (build 2345), еще одно проявление ранее описанного бага, когда переданный в шаблонную функцию указатель выступает для одних операций типом данных указатель, для других - типом данных класс:

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

Баг МТ5 (build 2345), не выполняется проверка на наличие повторно использованных имен шаблонных типов при объявлении шаблонной функции внутри шаблонного класса, что приводит к неожидаемому поведению:

#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);
}
 
Баг МТ5 (build 2345) отсутствует инкапсуляция при работе с шаблонными методами класса:

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.
}
 
Баг МТ5 (build 2345) в конструкторе базового класса невозможно выполнить explicit typecast по приведению указателя на объект базового класса к указателю на родительский класс.

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

Получается для реализации "патерна" по эмуляции работы виртуальных шаблонных функций необходимо тянуть в базовый класс кроме наследования типов еще и непосредственное значение указателя на родительский класс, что не есть good...
 

У кого-нибудь компилируется вот это?

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

Что не так?

Причина обращения: