Hatalar, hatalar, sorular - sayfa 2006

 
fxsaber :

Neden her iki seçeneğin de derlenmesi gerekiyor?

Genelde şablonları nadiren kullanırım - ayrıntılara girmedim - yalnızca sezgisel düzeyde açıklayabilirim

2. durumda, T'nin A * ile doğrudan değiştirilmesi normal olarak derlenir - bu, şablonun derlenmesi gerektiği anlamına gelir

 class A {};
void f( A * const ) {}
void OnStart ()
{
        A *a;
        f( a ); //нормально
}

1. durumda, doğrudan değiştirme çalışmaz, ancak fazlalık bir T2 parametresi ekleyebilirsiniz - normal olarak onunla derlenir - bu, onsuz olması gerektiği anlamına gelir - bu yüzden gereksizdir

 template < typename T, typename T2>
void f( T, const T2 ) {}
class A {};
void OnStart ()
{
         const A *a;
        f( a, a ); //нормально
}
 
A100 :

Sezgisel olarak, const bazen türün bir parçası ve bazen yalnızca bir tanımlayıcıdır, bu nedenle işlevin içinde işaretçi const olacaktır.

Bu, Print (__FUNCSIG__) aracılığıyla hissedilebilir;

 
Optimizasyon tablosunda aşağı çekme değerinin nasıl görüntülendiği garip. Araçla maksimum düşüş görüntülenir (ancak yüzde olarak yazılır). Ve tek bir testten sonra, göreceli düşüşün maksimumdan farklı olduğu ortaya çıkıyor (yüzde daha büyük veya daha az). Para yönetimini kullanırken, istenen sonuçları görüntülemek için bir şeyler eklemeniz gerekecek mi?
 
A100 :

Derlerken hata

 template < typename T>
void f( T, const T ) {}
class A {};
void OnStart ()
{
        A * const a = new A;
        f( a, a ); //error: 'a' - cannot convert from const pointer to nonconst pointer
}
Bu yüzden derler, orijinal sürüm olmamalıdır.
 
Комбинатор :
Bu yüzden derler, orijinal sürüm olmamalıdır.

Niye ya?

 template < typename T>
struct B {
         void f( T, const T ) {}
};
class A {};
void OnStart ()
{
           const A* a;
        B< const A*> b;
        b.f( a, a ); //нормально
}

yani her şey yolunda. Temelde ne değişti?

 template < typename T>
        void f( T, const T ) {}
class A {};
void OnStart ()
{
          const A *a;
          f( a, a ); //error: 'a' - cannot convert from const pointer to nonconst pointer
}
 
A100 :

Temelde ne değişti?

Fark çok büyük! İşte aradığın şey

 void B< const A*>::f( const A*, const A*)
Derleyici, şablonun gerekli doğru sürümünü tahmin edemediği için hata verir. Belli ki ona söylemiş
 template < typename T>
         void f( T, const T ) {}
class A {};
void OnStart ()
{
           const A *a;
          f < const A*> ( a, a );
}

Ve her şey çalıştı.

 
fxsaber :
Ve her şey çalıştı.

Neden ekstra karakterler?

 
A100 :

Neden ekstra karakterler?

Derleyicinin şablonun tam olarak çalışan bir sürümünü tahmin etmediğini göstermek için.

 
fxsaber :

Derleyicinin şablonun tam olarak çalışan bir sürümünü tahmin etmediğini göstermek için.

Ne için? ServiceDesk bunu kendi başına çözebilir

 
A100 :

Niye ya?

Uzmanlığınıza göre, tür, yapılan const'ı atmalıdır. İstenen türün açık bir göstergesi ile elbette derlenecektir.