SORU
12 NİSAN 2009, Pazar


STL algoritmaları kullanarak yerel sınıflar

Her zaman STL algoritmaları doğrulamaları olarak yerel olarak tanımlanmış sınıflar kullanamazsınız neden merak ettim.

Soru: diyor ki, bu söz BubbaT Approaching STL algorithms, lambda, local classes and other approaches,'C standardı bu yana yasaklar bağımsız değişken olarak kullanılmak üzere yerel çeşitleri'

Örnek kod:

int main() {
   int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
   std::vector<int> v( array, array 10 );

   struct even : public std::unary_function<int,bool>
   {
      bool operator()( int x ) { return !( x % 2 ); }
   };
   std::remove_if( v.begin(), v.end(), even() ); // error
}

Herkes standart ürünler nerede olduğunu bilen var mı? İzin vermeme yerel türleri için gerekçe nedir?


EDİT: C beri 11, bunun yasal bir şablon bağımsız olarak, yerel bir tür kullanmaktır.

CEVAP
12 NİSAN 2009, Pazar


Açıkça C 98/03 standart tarafından yasaklandı.

Bu kısıtlamayı kaldırmak C 11.

Daha eksiksiz olması için :

Bu tip kısıtlamalar şablon parametreleri olarak kullanılırlistelenir C 03 madde 14.3.1(ve C 98) standart:

Yerel bir türü, hiçbir bağlantı ile bir tür, isimsiz bir türü ya da bir tür bileşik bu tür herhangi birinden olmayacaktır bir şablon bağımsız değişken olarak kullanılan tip-parametre şablonu.

template <class T> class Y { /* ... */  }; 
void func() {   
      struct S { /* ... */ }; //local class   
      Y< S > y1; // error: local type used as template-argument  
      Y< S* > y2; // error: pointer to local type used as template-argument }

Kaynak ve daha fazla ayrıntı : http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=420

Özetle, bu kısıtlama eğer standart daha hızlı gelişiyordu... er giderildi ki bu bir hataydı

Bu ortak uygulamaları en son sürümlerine ve izni ile birlikte lambda ifadeleri veren yok bugün dedi.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ★TheCrono Official Channel★

    ★TheCrono

    3 Mayıs 2014
  • AmeriiK_HD

    AmeriiK_HD

    16 AĞUSTOS 2012
  • InfinityWard

    InfinityWard

    19 EYLÜL 2006