Hatalar, hatalar, sorular - sayfa 1730

 
Ilyas :
Bu doğru, burada yazarken, T = A *

Sonra burada derleme hatası

 template < typename T>
void f1( const T   const & a[] ) {} //error: 'const' - unexpected token
class A {};
void f2( const A* const & a[] ) {}
class B {
         void g1() const { f1( a ); }
         void g2() const { f2( a ); }
        A *a[];
};
 
Sergei Vladimirov :
Aynen öyle. Tüm bu iddiaları okudum ve sorunun nerede olduğunu anlayamıyorum. Bu dosyaları bir diskette mi depolayacaksınız?


Ne yani, 50 kilobaytlık bir dosya yerine 100 kilobaytlık bir dosya kaydettiğinizde disk eskir mi? Kendin de komik değil mi? )

Ve bir telif hakkı sembolü nedeniyle (prensipte uluslararasıdır ve kodunun 127'den büyük olmasına rağmen tüm kodlamalarda bulunur) , dosya boyutunun anlamsız bir şekilde iki katına çıkması normal midir? Akıllıca değil mi? Dosyaları neden gereksiz yere 2 kez şişirelim?

Sorun sadece boyutta değil, aynı zamanda bağlamsal aramada da. Dosyalar ASCII'de olduğu sürece, dosya yöneticileri de dahil olmak üzere birçok üçüncü taraf program, bağlam dizesine göre dosyaları arayabilir. Bunu neredeyse her gün kullanıyorum. Bu bağlamda yerel MQ düzenleyicisi, diğer birçok belirgin kodlama sorunuyla aynı sıfırdır. Unicode'u alır almaz, bağlamsal arama ile ilgili 2 sorun ortaya çıkıyor: önce kodlamayı "anlamanız", ardından tek bir forma normalleştirmeniz (örneğin, tüm ASCII'yi anında Unicode'a kodlamanız) ve ancak o zaman "aramanız" gerekir - tüm programlar bunu yapamaz veya yapmak istemez, ancak bunlar için bu olabilir, nokta 2 - frenleri elde ederiz.

Elbette, bazıları için vidaya ek olarak yeni bir bilgisayar satın almak, neyin uygun ve etkili yazılımın olması gerektiğini düşünmekten veya en azından diğer ürünler örneğinden öğrenmekten daha kolaydır.

 
A100 :

Sonra burada derleme hatası

C++'da da belirsizlik yazın: const T const

Ancak bir çıkış yolu var - const'ı sağa yeniden düzenleyin

template < typename T>
void f1(  T         const & a[] ) {} //error: 'const' - unexpected token
class A {};
void f2(  A const * const & a[] ) {} //нормально
class B {
         void g1() const { f1( a ); } //error: 'f1' - cannot to apply function template
         void g2() const { f2( a ); } //нормально
        A *a[];
};
C++ hatasız derler (sözdizimi farkını dikkate alarak)
 
A100 :

C++'da da belirsizlik yazın: const T const

Ancak bir çıkış yolu var - const'ı sağa yeniden düzenleyin

C++ hatasız derler (sözdizimindeki farkı dikkate alarak)

Ancak "const A" ve "A const" aynı anlama geldiğinde mantıksal olarak garip çıkıyor.

" A const * " öğesinin bir const nesnesine değil bir const işaretçisi olması mümkündür.

Öyle görünüyor. Çünkü böyle bir yapı var

class A {};
void f( const A const * const & a[] ) {}

Bir işaretçiyi değiştiremezsiniz, referansa göre değiştiremezsiniz ve nesneyi/nesneleri değiştiremezsiniz.

Hızlı kod elde etme açısından, böyle bir yapı derleyiciye gerekli ipucunu verebilir mi?

 
Stanislav Korotky :

Ve bir telif hakkı sembolü nedeniyle (prensipte uluslararasıdır ve kodunun 127'den fazla olmasına rağmen tüm kodlamalarda bulunur), dosya boyutunun 2 kat artması normaldir...

Evet. Hayatım boyunca, bu ekonomide kibritlerde bir anlam görmüyorum.
 
İlginç bir şekilde, böyle bir tasarımda
class A {};
void f( const A const * & a[] ) {}

Öğeleri değiştiremezsiniz, ancak bir dizinin boyutunu değiştirebilirsiniz .

Harika, yöntemlerin böyle görünebileceği ortaya çıktı

class A {};
class B
{
   const A const * Method( const A const * const & a[] ) const
  {
     return (a[ 0 ]);
  }
};
 
fxsaber :

" A const * " öğesinin bir const nesnesine değil bir const işaretçisi olması mümkündür.

Bir şablon değilse, "A const *", "const A *" ile eşdeğerdir ve bir şablon ise - duruma göre (C++'da)
 
A100 :
Bir şablon değilse, "A const *", "const A *" ile eşdeğerdir ve bir şablon ise duruma göre
Yani denklik olmamalı. MQL bu eşdeğeri dikkate alır, ancak
class A
{
public :
   int i;
};

void f( A const * & a[] )
{
  a[ 0 ].i = 1 ; // 'i' - constant cannot be modified
}
Bence burada bir yanlışlık var. Çünkü const nesnelerine (const A) bir işaretçi dizisi değil, bir const işaretçileri dizisi (const *) iletilir.
 
A100 :
Özellikle, bu ileride düzeltildi https://www.mql5.com/ru/forum/1111/page1749#comment_2892563
O zaman ifadenizde denklik olmamalı
A100 :
Bir şablon değilse, "A const *", "const A *" ile eşdeğerdir ve bir şablon ise - duruma göre (C++'da)
 
fxsaber :
İlginç bir şekilde, böyle bir tasarımda
class A {};
void f( const A const * & a[] ) {}

Öğeleri değiştiremezsiniz, ancak bir dizinin boyutunu değiştirebilirsiniz.

Gerçekten? Kahretsin, böyle olmamalı.