2012-12-08 23 views
12

Chcę przetłumaczyć zagnieżdżone defekty python na C++, co robię przy użyciu zagnieżdżonych struktur.Struktury zagnieżdżone za pomocą metod używających szablonów

#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); 
} 

Ten kod działa poprawnie. Problem polega na tym, że chcę szablonów, aby zagnieżdżone funkcje mogły korzystać z dowolnego typu parametrów. Jednak, gdy próbuję użyć szablonów:

#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); 
} 

pojawia się błąd:

/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' 

Czy ktoś wie, czy to, co chcę zrobić jest możliwe w C++? Dzięki!

+0

ponieważ C++ jest kompilowany język (i dlatego od decyzji projektowych język), zagnieżdżanie kodowanym (a zwłaszcza metody w tych strukturach) mają konsekwencje. Sugeruję, abyś nauczył się "funkcji wbudowanych", aby zrozumieć plusy i minusy projektowania twojego kodu w ten sposób. –

+2

@MegaJoules: nie często pytanie stackoverflow znajduje błąd kompilatora uczciwości. –

+0

@MooingDuck: Chyba że mówimy o VC++. :-P – ildjarn

Odpowiedz

2

Mogę się mylić, ale to wygląda na błąd kompilatora. GCC (4.7.2) generuje ten błąd, podczas gdy Clang (3.1) i ICC (13.0.0) radzą sobie z tym dobrze.

Kod Minimal za próbę odtworzenia tego na innych kompilatorów: http://pastebin.com/kf2sF3NL

+0

Jestem ograniczony do używania GCC 4.4.6 – MegaJoules

+0

@MegaJoules Więc ten błąd nie jest ostatnim regresem. (Jeśli jest to błąd.) Opublikowalem o tym na liście mailingowej GCC. Minimalny kod odtwarzający to btw to: http://pastebin.com/kf2sF3NL –

+0

@NikosC .: link do raportu o błędzie? –

Powiązane problemy