오류, 버그, 질문 - 페이지 2663

 
주식 시장의 계산에 심각한 버그가 있지만 신경 쓰지 않고 의도적으로 또는 실수로이 문제가 눈에 띄지 않게됩니다.
 
Aleksey Vyazmikin :

심각한 경우가 있습니다. 사용할 수 있는 논리가 누락되었습니다.

이러한 입력이 있는 기능이 있습니다.

따라서 이 함수는 때때로 값 769를 제공합니다.

첫 번째 인쇄의 주석을 제거하면

그러면 올바른 값이 반환됩니다.

함수가 잘려서 에러가 나는 시점 에 함수 가 호출될 때 활성화되지 않은 코드를 제거하는 것만으로도 에러가 나지 않습니다.

분명히 컴파일러 오류-전체 기능을 보낼 개발자, 그렇지 않으면 포럼에 적합하지 않습니다.

스위치를 통해 제작 - 모든 것이 작동합니다. 그래서 컴파일러에 있습니다.

 
저장소에 커밋할 수 없습니다...
 
Alexey Kozitsyn :
저장소에 커밋할 수 없습니다...

이미 처럼 벌었습니다.

 
Artyom Trishkin :

이미 처럼 벌었습니다.

네.

 
MT5 버그(빌드 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
}
 

버그 MT5(빌드 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);
}
 
클래스 템플릿 메서드로 작업할 때 MT5 버그(빌드 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.
}
 
기본 클래스 생성자의 MT5 버그(빌드 2345)로 인해 기본 클래스 개체에 대한 포인터를 부모 클래스에 대한 포인터로 캐스팅하여 명시적 유형 변환을 수행하는 것이 불가능합니다.

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

가상 템플릿 기능의 작업을 에뮬레이트하기 위해 "패턴"을 구현하려면 유형 상속 외에도 기본 클래스로 끌어야 하며 상위 클래스에 대한 포인터의 직접적인 값도 필요합니다. 좋지 않다 ...
 

이것을 컴파일하는 사람이 있습니까?

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

뭐가 문제 야?