SORU
13 Mart 2009, Cuma


Neden g typedef typename kullanmam gerekiyor ama VS değil mi?

GCC, bu beni yakaladı beri bir süre olmuştu, ama bugün. Ama asla GCC şablonları içinde typedef typename gerektirir neden anladım, VS sırasında ve ICC yok sanırım. Typedef typename bir şey "" ya overstrict bir standart, ya da derleyici yazarları için sol bir şey? hata değildir

Burada ne demek istediğimi bilmeyenler için bir örnek:

template<typename KEY, typename VALUE>
bool find(const std::map<KEY,VALUE>& container, const KEY& key)
{
    std::map<KEY,VALUE>::const_iterator iter = container.find(key);
    return iter!=container.end();
}

Yukarıdaki kod VS (ve muhtemelen ICC) derler, ancak böyle istediği için: GCC başarısız

template<typename KEY, typename VALUE>
bool find(const std::map<KEY,VALUE>& container, const KEY& key)
{
    typedef typename std::map<KEY,VALUE>::const_iterator iterator; //typedef typename
    iterator = container.find(key);
    return iter!=container.end();
}

Not: şu an kullandığım gerçek bir işlevi, ama sadece sorunu gösteren aptalca bir şey değildir

CEVAP
13 Mart 2009, Cuma


Typename standardının gereğidir. Şablon derleme iki aşamalı bir doğrulama gerektirir. İlk geçiş sırasında derleyici aslında türü kısaltmaları girmeden şablon sözdizimi doğrulamak gerekir. Bu adımda,:: std göster::yineleyici bir değeri olduğu varsayılır. Eğer bir tür belirtmek yoksa typename anahtar gereklidir.

Bu neden gerekli? Gerçek ANAHTAR ve DEĞER türü substituing önce, derleyici olamaz şablonu özel olmadığını ve uzmanlık tanımlıyor güvence altına almakyineleyicibaşka bir şey olarak anahtar kelime.

Bu kod ile kontrol edebilirsiniz:

class X {};
template <typename T>
struct Test
{
   typedef T value;
};
template <>
struct Test<X>
{
   static int value;
};
int Test<X>::value = 0;
template <typename T>
void f( T const & )
{
   Test<T>::value; // during first pass, Test<T>::value is interpreted as a value
}
int main()
{
  f( 5 );  // compilation error
  X x; f( x ); // compiles fine f: Test<T>::value is an integer
}

Son çağrı bir hata ilk şablonu derleme sırasında f adım olduğunu belirten başarısız() Test::Test değeri<^ değer ama bir örnekleme olarak yorumlandı . X türü verimleri tip şablon.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • NYCarspotter

    NYCarspotter

    26 EYLÜL 2011
  • Ralph Phillips

    Ralph Philli

    5 Aralık 2006
  • TheSalband Rai

    TheSalband R

    11 NİSAN 2011