2012-05-01 32 views
4

我正在用STL C++ 0x容器(工具鏈是GCC 4.7.0)調試一些C++分析器。打印實例化鏈

而且由於STL重新綁定代碼是難以理解的,我需要以某種方式打印等typedef的實例化的完整鏈。當然,它只能解析爲T&,但在它穿過__gnu_cxx和其他內部中的至少7個不同模板之前。

因此,我期待類似打印模板錯誤的情況,但每個類都由編譯器實例化。 這可能嗎? GCC插件,也許...

UPD:好吧,我已經手動實例化所有需要的模板。看起來沒有什麼好的方法可以自動執行此操作,除了向GCC代碼本身插入一些調試printf語句外。

+0

你嘗試STLFilt:?儘管最初開發的目的是幫助您處理模板實例化相關的錯誤(並且在'概念'之前 - 儘管它們還沒有作爲標準的一部分),但它可能只是值得您一段時間。我不認爲他們有C++ 11特定的變化,因爲活動開發停止了一段時間。否則,你需要編寫你自己的模板編譯器。 – dirkgently

+0

您是否從源代碼構建GCC?我似乎想起了很多調試轉儲選項,並且您可能能夠獲得每個模板實例化的狀態消息。不過,它可能會涉及繞過驅動程序。 – Potatoswatter

回答

0

由於您使用的是GCC 4.7,我假設您在系統中可以對您的代碼運行clang。鏗鏘的錯誤信息,特別是與模板相當不錯。

 

    template 
    class Example { 
     Example(const T& t) : t_(t) {} 
     T& t_; 
    }; 

    int a; 
    Example e(a); 

輸出:

 

    t.cpp:8:14: error: calling a private constructor of class 'Example' 
    Example e(a); 
       ^
    t.cpp:3:5: note: implicitly declared private here 
     Example(const T& t) : t_(t) {} 
     ^
    t.cpp:3:27: error: binding of reference to type 'int' to a value of type 'const int' drops 
      qualifiers 
     Example(const T& t) : t_(t) {} 
          ^~ 
    t.cpp:8:14: note: in instantiation of member function 'Example::Example' requested here 
    Example e(a); 
       ^
    2 errors generated. 

+0

GCC 4.7如何暗示Clang,並且問題涉及代碼沒有錯誤。 – Potatoswatter

+0

啊,我誤解它的意思是「我需要更好的來自某些模板代碼的錯誤消息。」 –