2012-05-01 1 views
4

STL C++ 0x 컨테이너 (toolchain은 GCC 4.7.0)로 일부 C++ 파서를 디버깅합니다.인스턴스화 체인 인쇄

STL 리 바인딩 코드는 거의 이해할 수 없기 때문에 std::vector<T>::reference과 같은 typedef에 대한 인스턴스화의 전체 체인을 인쇄해야합니다. 물론 T&으로 끝나기도하지만 __gnu_cxx 및 다른 내부에서 적어도 7 개의 다른 템플릿을 통과하기 전에 해결됩니다.

그래서 템플릿 오류의 경우 인쇄되는 것과 같은 것을 기대하지만, 의 경우 모든 클래스는 컴파일러에 의해 인스턴스화됩니다. 가능합니까? GCC 플러그인, 아마도 ...

UPD : 필요한 모든 템플릿을 수동으로 인스턴스화했습니다. 일부 디버그 printf 문을 GCC 코드 자체에 삽입하는 것을 제외하고는 자동으로이를 수행하는 좋은 방법이없는 것 같습니다.

+0

당신은 STLFilt을 시도해 봤어 : ? 원래 템플릿 인스턴스 생성 관련 오류 (그리고 '개념'이전에는 - 아직 표준에 포함되지는 않았지만) 작업을 돕기 위해 개발되었지만, 그럴 가치가 있습니다. 액티브 개발이 잠시 중단 된 이후로 C++ 11 특정 변경 사항이 있다고 생각하지 않습니다. 그렇지 않으면, 당신은 자신의 템플릿 컴파일러를 작성해야합니다. – dirkgently

+0

소스에서 GCC를 빌드 했습니까? 디버깅 덤프 옵션을 많이 생각한 것 같고 모든 템플릿 인스턴스화에 대한 상태 메시지를 얻을 수 있습니다. 드라이버를 우회하는 것이 포함될 수도 있습니다. – Potatoswatter

답변

0

GCC 4.7을 사용하고 있으므로 코드에 대해 clang을 실행할 수있는 시스템에 있다고 가정합니다. 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

아아, 나는 "일부 템플릿 코드에서 더 나은 오류 메시지가 필요합니다."라는 말을 잘못 읽었습니다. –