Hatalar, hatalar, sorular - sayfa 2663

 
Borsalarda ciddi bir hesaplama hatası var ama umursamıyorsunuz ve bilerek mi yanlışlıkla mı belli olmuyor bu sorun gözden kaçıyor.
 
Aleksey Vyazmikin :

Ciddi bir vakam var - bana sunulan mantık eksik.

Bu tür girdilere sahip bir fonksiyon var

Bu nedenle, bu İşlev bazen 769 değerini verir.

ilk baskının yorumunu kaldırırsanız

sonra doğru değer döndürülür.

İşlev kesilirse, hata anındaişlev çağrıldığında etkinleştirilmeyen kodun kaldırılması yeterlidir, o zaman hata da olmaz.

Açıkçası bir derleyici hatası - tam işlevi kime gönderecekleri geliştiriciler, aksi takdirde foruma sığmaz.

Anahtarla yapıldı - her şey çalışıyor. Yani derleyicide.

 
Depolama işlemi gerçekleştirilemiyor...
 
Alexey Kozitsyn :
Depolama işlemi gerçekleştirilemiyor...

Zaten beğeni kazandı.

 
Artyom Trishkin :

Zaten beğeni kazandı.

Evet.

 
İşaretçi şablon işlevine geçtiğinde, daha önce açıklanan hatanın başka bir tezahürü olan MT5 hatası (derleme 2345), bazı işlemler için bir işaretçi veri türü ve diğerleri için bir sınıf veri türü olarak hareket eder:

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

Hata MT5 (derleme 2345), bir şablon sınıfı içinde bir şablon işlevi bildirilirken yeniden kullanılan şablon türü adlarının kontrol edilip edilmediğini kontrol edin, bu da beklenmeyen davranışlara yol açar:

 #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);
}
 
Sınıf şablonu yöntemleriyle çalışırken MT5 hatası (2345 derlemesi) eksik kapsülleme:

 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.
}
 
Temel sınıf oluşturucusunda MT5 hatası (derleme 2345), işaretçiyi temel sınıf nesnesine, işaretçiye üst sınıfa aktararak açık tip yayın gerçekleştirmek mümkün değildir.

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

Görünen o ki, sanal şablon işlevlerinin çalışmasına öykünmek üzere "desen"i uygulamak için, tür kalıtımına ek olarak temel sınıfa, ayrıca işaretçinin doğrudan değerini ana sınıfa sürüklemek gerekir. iyi değil ...
 

Bunu derleyen var mı?

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

Sorun nedir?