2012-12-08 47 views
12

我想將python嵌套defs轉換爲C++,我使用的是嵌套結構。嵌套結構與使用模板的方法

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

此代碼正常工作。問題是,我想要模板,以便嵌套函數可以使用任何類型參數。然而,當我嘗試使用模板:

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

我得到的錯誤:

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

有誰知道,如果我想要做的是用C++可能?謝謝!

+0

由於C++是編譯型語言(因爲語言的設計決策),嵌套結構(在這些結構特別法)產生的後果。我強烈建議你學習「內聯函數」來理解以這種方式設計代碼的優缺點。 –

+2

@MegaJoules:並不是經常出現一個stackoverflow問題,它找到了一個誠實善良的編譯器錯誤。 –

+0

@MooingDuck:除非我們在談論VC++。 :-P – ildjarn

回答

2

我可能是錯的,但這看起來像一個編譯器錯誤。 GCC(4.7.2)產生了這個錯誤,而Clang(3.1)和ICC(13.0.0)處理得很好。

爲試圖重現這在其它編譯器最少的代碼:http://pastebin.com/kf2sF3NL

+0

我只能使用GCC 4.4.6 – MegaJoules

+0

@MegaJoules所以這個bug並不是最近的迴歸。 (如果它是一個錯誤。)我在GCC郵件列表上發佈了關於此的信息。再現這個順便說一句的最小代碼是:http://pastebin.com/kf2sF3NL –

+0

@NikosC .:鏈接到bug報告? –