2012-06-16 3 views
0

는 코드는 아래와 같은 오류를 산출 Ideone 또는 Codepad에 컴파일되지 않습니다 :VC++ 2010 비표준 종속 기본 클래스에서이 이름 조회입니까?

'X' was not declared in this scope

하지만 VC++ 2010을 수행합니다

int, charfloat을 인쇄
#include <iostream> 
    #include <typeinfo> 

    template<typename T> 
    struct Base 
    { 
      typedef T X; 
    }; 

    template<typename T> 
    struct Derived 
    : 
      Base<T> 
    { 
      static void print() 
      { 
        std::cout << typeid(X).name() << "\n"; 
      } 
    }; 

    int main() 
    { 
      Derived<int>::print(); 
      Derived<char>::print(); 
      Derived<float>::print(); 
      return 0; 
    } 

. 내 코드를 다음과 같이 변경해야합니까? 012-

+0

두 번째 예제에서 상속을 취소 하시겠습니까? – juanchopanza

+0

@juanchopanza 그렇습니다. 예를 들어'Base '가 더 많은 템플릿 매개 변수에 의존하는 실제 프로젝트의 예제 였기 때문에 그걸 삭제하려고했기 때문에 내부 typedef가 코드를 좀 더 읽기 쉽게 만듭니다. 가독성은 실제로 MSVC++에서 상속을 시도한 이유 였지만 g ++에서는 실패했습니다. – TemplateRex

+1

[이 질문과] 같은 대답 (http://stackoverflow.com/questions/7908248/using-this-keyword-in-destructor). – curiousguy

답변

1

:

template<typename T> 
struct Derived : Base<T> { 
    static void print() { 
    std::cout << typeid(typename Base<T>::X).name() << "\n"; 
    } 
}; 

그렇다면 표준 준수 코드입니다. 그러나 typeid(some type).name()의 결과는 구현에 따라 다릅니다. GCC에서 메인은 i, cf입니다.

-1

$ g ++ - 벽 Test.cpp에
Test.cpp에 :
Test.cpp에 : 15 : 37 : 오류 정적 멤버 함수 '정적 무효 파생 :: 인쇄()'에서 'X'가 선언되지 이 범위에서

$ g ++ --version
g ++ (SUSE 리눅스) 4.6.2 당신이 (당신이 당신의 예에서 상속을 떨어 뜨린 주)에 해당하는 의미 경우

+0

이게 무슨 뜻인지, 그리고 그것이 그 질문과 어떻게 관련되어 있는지에 관해 몇 가지 내용을 줄 수 있습니까? –