서브 클래스에서 보호 된 구성원 액세스 : GCC vs MSVC
-
10-07-2019 - |
문제
Visual C ++에서는 다음과 같은 작업을 수행 할 수 있습니다.
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와 오류가 오류를주는 무언가가 잘못 구성되어 있습니까?
해결책
이것은 허용되었지만 변경되었습니다 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 ();
}
다른 팁
나는 이것을 알아 냈다 :
- C ++ Super FAQ : "템플릿 파생 클래스가 템플릿베이스 클래스에서 상속되는 중첩 유형을 사용할 때 오류가 발생하는 이유는 무엇입니까?"
- C ++ Super FAQ : "템플릿 파생 클래스가 템플릿베이스 클래스에서 상속되는 멤버를 사용할 때 오류가 발생하는 이유는 무엇입니까?"
분명히 첫 번째 예제는 유효한 C ++가 아니며 MSVC가 이것을 취하는 것은 나쁘다. C ++ FAQ 라이트에 솔루션이 게시되었습니다.
당신은 읽고 싶을 수도 있습니다 2 단계 이름 조회
제휴하지 않습니다 StackOverflow