2008-10-11 3 views
5

대 GCC는,이 같은 일을 수행 할 수 있습니다액세스 보호 회원 : 비주얼 C++에서 MSVC

template <class T> 
class A{ 
protected: 
    T i; 
}; 

template <class T> 
class B : public A<T>{ 
    T geti() {return i;} 
}; 

을 내가, 내가 오류가 발생 ++ g이를 컴파일하려고합니다. 이 작업을 수행해야합니다 :

template <class T> 
class B : public A<T>{ 
    T geti() {return A<T>::i;} 
}; 

전자는 표준 C++에서 처리하지 않습니까? 또는 gcc에서 잘못 설정되어 오류가 발생 했습니까?

+0

gcc의 버전은 무엇입니까? – dmckee

+0

gcc 4.2 –

+0

오류가 발생했습니다. –

답변

6

이전에는 허용되었지만 gcc 3.4으로 변경되었습니다.

템플릿 정의에서 정규화되지 않은 이름은 더 이상 종속 기반의 구성원을 찾을 수 없습니다 (C++ 표준의 [temp.dep]/3에 지정된대로). 예 :

template <typename T> struct B { 
     int m; 
     int n; 
     int f(); 
     int g(); 
    }; 
    int n; 
    int g(); 
    template <typename T> struct C : B<T> { 
     void h() 
     { 
     m = 0; // error 
     f(); // error 
     n = 0; // ::n is modified 
     g(); // ::g is called 
     } 
    }; 

그 (것)들에 접두사를 붙이는 것에 의해 this->.

명백하게, 첫 번째 예는 유효하지 : 여기 이것 냈 C : H의 보정 정의

template <typename T> void C<T>::h() 
    { 
     this->m = 0; 
     this->f(); 
     this->n = 0 
     this->g(); 
    } 
+0

ㅎ ... 내가 한 것과 동시에 게시해야합니다. msvc가 유효하지 않더라도 이상한 런타임 오류를 일으키는 것은 이상합니다. –

+0

예, 출시 노트를 찾은 직후 귀하의 게시물을 보았습니다. 아마도 gcc와 vC++의 오래된 버전이 잘못된 방법을 지원했을 것이라고 생각합니다. 하지만 gcc가 올바른 선택을하고 vC++은 이전 버전과의 호환성을 유지하기로 결정했습니다. –

3

은 C + +와 msvc이 걸리는 것이 나쁘다. C++ faq lite에 게시 된 솔루션이 있습니다.

관련 문제