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
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.
Neden yeni bir anahtar gerekiyor ve ne...
Neden't GCC*****a (**)*(**) optim...
Neden' â—ŽÜ«â—Ž ve fonksiyonu t JavaSc...
Nereye ve neden&; ÅŸablon" quot; ve...
Neden boyutu(x ) x artım değil mi?...