Hatalar, hatalar, sorular - sayfa 2674

 

Lütfen, bunun gibi basit türler ve işaretçiler için ayrı işlemeye ihtiyacınız olduğunda "aşırı yüklenmiş işleve belirsiz çağrı" hatasını çözmenin düzgün bir yolu olup olmadığını hatırlatın:

     template < typename V>
     void process(V value)
    {
    }

     void process(BaseFunctor *ptr)
    {
    }

Burada derleyici (BaseFunctor *) öğesinin V ile de eşleştiğini düşünür. Yöntemi çağırırken açıkça cast yazabilirsiniz , ancak bu çirkindir. Bir şablon işlevi bir parametreyi referans olarak kabul ederse, sabitleri ve diğer geçici değerleri (bir değişken gereklidir) iletmek mümkün olmayacaktır.

 
Stanislav Korotky :
bir bağlantıyla aşırı yükleme eklemeyi deneyin
 
TheXpert :
bir bağlantıyla aşırı yükleme eklemeyi deneyin

Bir nesne referansı veya bir işaretçi referansı (var olmayan) ile aşırı yüklemeyi mi kastediyorsunuz? New üzerinden dağıtılmış bir örneğe bir işaretçiyi bir nesneye başvuruya nasıl kaydıracağımı bilmiyorum.

 
Artyom Trishkin :

Döngünüz pozisyonları kapatmak için doğru değil. Bir ters döngü yapın.

Artyom Trishkin :

Döngünüz pozisyonları kapatmak için doğru değil. Bir ters döngü yapın.

Deneyeceğim, ancak tüm karlı pozları tek bir yönde arıyorsak nasıl çözeceğimiz aynı değil mi? Her durumda, her şeyi sıralayacağız ve gerekli olanları kapatacağız.

 
Stanislav Korotky :

Bir nesne referansı veya bir işaretçi referansı (mevcut görünmüyor) ile aşırı yükleme mi demek istiyorsunuz? New üzerinden dağıtılmış bir örneğe bir işaretçiyi bir nesneye başvuruya nasıl kaydıracağımı bilmiyorum.

nesnelere referansla.

Ben de öyle:

 class C {};

template < typename V>
void process(V value)
{
}

/* если добавить, компилируется
template<typename V>
void process(V& value)
{
}
*/

void process(C *ptr)
{
}
    
void OnStart ()
  {
      C c;
      process(&c); // pointer, ok
      process(c); // 'process' - no one of the overloads can be applied to the function call       test2.mq5       32      7
  }
 
TheXpert :

nesnelere referansla.

Ben de öyle:

Hala o kadar basit değil, üzgünüm ;-). Sınıf miras için kullanılır:

 class BaseFunctor
{
   public :
     virtual void process() = 0;
};

class MyFunctor: public BaseFunctor
{
   public :
     virtual void process() override
    {
    }
};

template < typename V>
void process(V value)
{
}

void process(BaseFunctor *ptr)
{
}

void process(BaseFunctor &ref)
{
}

void OnStart ()
{
  process( new MyFunctor()); // 'process' - ambiguous call to overloaded function, could be one of 3 function(s)
}

Bir BaseFunctor oluşturmak mümkün olsaydı işe yarardı, evet. Ama durum böyle değil.

 
Pavel Kozlov :

Merhaba!

Hatayı bildirdiğiniz için teşekkürler!

Resimdeki sorunu daha detaylı anlatır mısınız?

Şu anda sorun yok

 

Aşağıdaki kodun çıktısı 牖漠摲牥⁳湩潦〉〮र〲थ⸰〲थ⸰㠉┰〉〮र

Ve metin testini göstermeli

Dosyalar Files\\Test\\ klasöründedir.

İşlev, tanıtıcının doğru olduğunu, 1'e eşit olduğunu yazar ve hemen GetLastError 5008 Geçersiz tanıtıcı hatası yazar ....

Nerede kazılır?

 //+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   core();
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {

  }
//+------------------------------------------------------------------+
void core()
  {
   string value = "" , name = "" ;

   name =   "Test" + "\\test.csv" ;
   Print ( FileIsExist (name));

   ResetLastError ();

   int m_hendle = - 1 ;
   m_hendle = FileOpen (name, FILE_READ | FILE_WRITE | FILE_CSV );
   if (m_hendle != INVALID_HANDLE )
     {
       Print (( string )m_hendle + "    " + name + " [" + ( string ) FileSize (m_hendle) + "]" + ( string ) GetLastError ());
       while (! FileIsEnding (m_hendle))
        {
         string sCurrent = FileReadString (m_hendle);
         Print ( "sCurrent = " , sCurrent);
        }
       FileClose (m_hendle);
     }
  }
//+------------------------------------------------------------------+
 
Sergey Dzyublik :
Daha fazla gelişmeyi engelleyen çok kötü MT5(build 2316) hatası.
Birkaç kez dahili bir "C" türü ile sarılmış karmaşık bir nesne yaratırsınız ve orada tamamen farklı bir veri türü olduğu ortaya çıkar, belki "B", belki "int", ne isterseniz ...

Sorunun kodda değil, MQL derleyicisinin çalışmasında olduğunu kazmak ve anlamak için çok zaman ve çaba harcadı. (C++ çevrimiçi: https://onlinegdb.com/H1R1fR5ML )
Muhtemelen sorun, derleme zamanında kod oluştururken "main_wrapper" şablon sınıfının önbelleğinde, "internal_wrapper" dahili sınıfı çeşitli veri türleri (int, B*, M.Ö).
"main_wrapper<A<TEMPLATE_TYPE>::internal_wrapper> şablon sınıfı tarafından hangi ilk veri türü oluşturulacak, bu veri türü gelecekte bu şablonun tüm nesnelerinde daha fazla kullanılacaktır.


Şablon sınıfı kodu oluşturma ile ilgili başka bir hata aşağıda sağlanacaktır.

Gönderdiğiniz için teşekkürler, düzeltildi

 
Vladimir Pastushak :

Aşağıdaki kodun çıktısı 牖漠摲牥⁳湩潦〉〮र〲थ⸰〲थ⸰㠉┰〉〮र

Ve metin testini göstermeli

Dosyalar Files\\Test\\ klasöründedir.

İşlev, tanıtıcının doğru olduğunu, 1'e eşit olduğunu yazar ve hemen GetLastError 5008 Geçersiz tanıtıcı hatası yazar ....

Nerede kazılır?

Dosya hangi kodlamada?