Hatalar, hatalar, sorular - sayfa 2271

 
A100 :
Derleme sırasında hata:

Ve (1)(2) ve (3)(4) arasındaki temel fark nedir???

(3)(4) sınıflarını işlevlerin dışında bildirirseniz, hata oluşmaz. Bir fonksiyon içinde bildirilirse oluşur.

 
Vladimir Pastushak :

Aşağıdaki davranışa ne sebep olabilir?

derlerseniz gösterge düzgün çalışır, yeniden derlerseniz gösterge düzgün çalışmıyor. Test cihazında düzgün çalışıyor mu?

Ne göstergesi?

 
fxsaber :

C++ burada ne çıktı verir ?

Bunun MQL5'te çalışması için aynı değil iki farklı çıktı diziniz olması gerekir. Ama o zaman imzaların oluşumu için tamamen farklı bir mekanizma olmalı. C++ aynı sonucu yazdırırsa, __FUNCSIG__ fiyatı önemli ölçüde düşer.

Sonuç: C++

void f<g1::A>( g1::A& )
void f<g2::A>( g2::A& )

Gördüğünüz gibi satırlar farklı... fonksiyon imzası kullanılıyor

 
A100 :

Sonuç: C++

void f<g1::A>( g1::A& )
void f<g2::A>( g2::A& )

Gördüğünüz gibi satırlar farklı... fonksiyon imzası kullanılıyor

MQL5 sorunları

 void f<A>(A&)

Onlar. fonksiyonun içinde sınıf imzası yoktur. Bir gün desteklenecektir.


Ve eğer sınıf global ise, o zaman C++ hangi satırın çıktısını verir?

void f<::A>( ::A& )

void f<A>( A& )

 
fxsaber :

MQL5 sorunları

Onlar. fonksiyonun içinde sınıf imzası yoktur. Bir gün desteklenecektir.

Eski C++ derleyicileri bunu desteklemiyorsa, kaynak kodunda zaten ilk satırda (1) bir hata veriyorlar. Bu nedenle, başlangıçta soru şu şekilde sorulmuştur: Neden bir durumda bir hata var, diğerinde normal?

Her iki durumda da aynı davranış bekleniyordu: ya bir hata ya da hata yok. Ve hata, destek eksikliğinde değil, eşit olmayan davranışta, diğer tüm şeylerin eşit olmasındadır ( bu örnekte olduğu gibi)

 
fxsaber :
Ve eğer sınıf global ise, o zaman C++ hangi satırın çıktısını verir?

void f<::A>( ::A& )

void f<A>( A& )

İkinci seçenek

 
A100 :

Eski C++ derleyicileri bunu desteklemiyorsa, kaynak kodunda zaten ilk satırda (1) bir hata veriyorlar. Bu nedenle, başlangıçta soru şu şekilde sorulmuştur: Neden bir durumda bir hata var, diğerinde normal?

Her iki durumda da aynı davranış bekleniyordu: ya bir hata ya da hata yok. Ve hata, destek eksikliğinde değil, eşit olmayan davranışta, diğer tüm şeylerin eşit olmasındadır ( bu örnekte olduğu gibi)

Yani bu anlaşılabilir. Derleyici, kod boyunca yukarıdan aşağıya doğru gider ve ilerledikçe uygun imzaları üretir. İlk imzayı sorunsuz oluşturdu. İkinciye geliyor - ve bu zaten var. İşte ikinci satırdaki hata.

 
Georgiy Merts :

(3)(4) sınıflarını işlevlerin dışında bildirirseniz, hata oluşmaz. Bir fonksiyon içinde bildirilirse oluşur.

Orijinal örnekte ise
         class   A2 { int i; }; //(3)

ile ikame edilmiş

         interface A2 {};      //(5)

o zaman fonksiyon içinde hata yok ... ve temel fark nedir?

 
fxsaber :

Yani bu anlaşılabilir. Derleyici, kod boyunca yukarıdan aşağıya doğru gider ve ilerledikçe uygun imzaları üretir. İlk imzayı sorunsuz oluşturdu. İkinciye geliyor - ve bu zaten var. İşte ikinci satırdaki hata.

Ve neden hatasız MQL'de derleniyor?

 template < typename T>
void f() { Print ( __FUNCSIG__ ); }
void g1() { class A { int     x; } a; f<A>(); }
void g2() { class A { double x; } a; f<A>(); }
void OnStart ()
{
        g1();
        g2();
}

Sonuç: MQL C++

void f<A>() void f<g1::A>()
void f<A>() void f<g2::A>()

İmzalar neden burada müdahale olmadan yaratılıyor?

 
A100 :

Ve neden hatasız MQL'de derleniyor?

Sonuç: MQL C++

void f<A>() void f<g1::A>()
void f<A>() void f<g2::A>()

İmzalar neden burada müdahale olmadan yaratılıyor?

Biri yaratılıyor. Üstelik f'de T'yi kullanamazsınız. Genel olarak durum bana göre açık.