2012-12-08 14 views
12

Yuvalanmış yapıları kullanarak yapıyorum, python iç içe geçmiş def'leri C++ 'ya çevirmek istiyorum.Şablonları kullanarak yöntemlerle iç içe yapıları

#include<iostream> 
static void ffunc(int x, int y) 
{ 
    static int x1 = x; 
    static int y1 = y; 
    struct g 
    { 
     static void gfunc(int z) 
     { 
      static int z1 = z; 
      std::cout << x1 << y1 << z << std::endl; 

      struct h 
      { 
       static void hfunc(int k) 
       { 
        std::cout<< x1 << y1 << z1 << k << std::endl; 
       } 
      }; 
      h::hfunc(4); 
     } 
    }; 
    g::gfunc(3); 
} 
int main() 
{ 
    ffunc(1, 2); 
} 

Bu kod düzgün çalışıyor. Sorun şu ki, şablonlar istiyorum, böylece iç içe geçmiş işlevler herhangi bir tip parametresini kullanabilir. Ancak, ne zaman şablonları kullanmayı deneyin:

#include<iostream> 
template <typename t1> 
static void ffunc(t1 x, t1 y) 
{ 
    static t1 x1 = x; 
    static t1 y1 = y; 
    struct g 
    { 
     static void gfunc(int z) 
     { 
      static int z1 = z; 
      std::cout << x1 << y1 << z << std::endl; 

      struct h 
      { 
       static void hfunc(int k) 
       { 
        std::cout<< x1 << y1 << z1 << k << std::endl; 
       } 
      }; 
      h::hfunc(4); 
     } 
    }; 
    g::gfunc(3); 
} 
int main() 
{ 
    ffunc(1, 2); 
} 

hata alıyorum:

/tmp/cceIMovo.o: In function `void ffunc<int>(int, int)::g::gfunc(int)': 
nested.cc:(.text+0x17d): undefined reference to `y1' 
nested.cc:(.text+0x183): undefined reference to `x1' 
/tmp/cceIMovo.o: In function `void ffunc<int>(int, int)::g::gfunc(int)::h::hfunc(int)': 
nested.cc:(.text+0x1e5): undefined reference to `z1' 
nested.cc:(.text+0x1ec): undefined reference to `y1' 
nested.cc:(.text+0x1f2): undefined reference to `x1' 

kimse ne yapmak istiyorum c mümkün olup olmadığını biliyor mu ++? Teşekkürler!

+0

bir derlenmiş dil (çünkü dil tasarım kararlarının), yuvalama yapılar (ve bu yapılar özellikle yöntemleri) sonuçları vardır. Kodunuzu bu şekilde tasarlamanın avantajlarını ve eksilerini anlamak için "satır içi işlevler" hakkında bilgi almanızı şiddetle öneririm. –

+2

@MegaJoules: Sık sık bir stackoverflow sorusu, dürüstlükten iyilik derleyici bir hata bulur. –

+0

@MooingDuck: VC++ hakkında konuşmuyorsak. : -P – ildjarn

cevap

2

Yanılıyor olabilirim ama bu derleyici bir hataya benziyor. GCC (4.7.2) bu hatayı üretirken, Clang (3.1) ve ICC (13.0.0) sadece onunla iyi anlaşır. diğer derleyiciler bu üretilmeye çalışılmaktadır için

Minimal kodu: C++ yana http://pastebin.com/kf2sF3NL

+0

GCC 4.4.6 – MegaJoules

+0

@MegaJoules kullanarak sınırlandırıldım Bu yüzden bu hata yeni bir gerileme değil. (Bu bir hata ise.) Bunu GCC posta listesinde yayınladım. Bu btw yeniden üreten minimum kod: http://pastebin.com/kf2sF3NL –

+0

@NikosC .: hata raporuna bağlantı? –