파생 클래스에서 수업의 보호 회원에 액세스
-
06-07-2019 - |
문제
여기에 오래된 코드베이스가 있는데, 여기서 보호 된 멤버 변수를 사용했습니다. 이것이 좋은 아이디어인지 아닌지에 대해 논의 할 수 있습니다. 그러나 코드는 GCC3에서 정상을 컴파일해야합니다. 클래스 템플릿 Foo에서 보호 된 멤버 X를 사용하는 파생 된 템플릿 클래스 바가 있습니다.
template <class Something> class Foo {
public:
// stuff...
protected:
some::type x;
}
template <class Something> Bar : Foo<Something> {
public:
void cleanup();
}
그리고 Cleanup ()의 메소드 선언에 x로 수행 된 작업이 있습니다.
template <class Something> void Bar<Something>::cleanup() {
doSomeThingCleanUpLike (x);
}
GCC3에서 작동하지는 않지만 GCC4에서는 작동하지 않습니다. 변경할 때 작동합니다
doSomeThingCleanUpLike (this->x);
왜 그런 경우가 있습니까?
해결책
표현식 x
파생 클래스에서 사용되는 것은 표준의 규칙에 따라 파생 클래스의 템플릿 매개 변수에 의존하지 않습니다. 이로 인해 조회는 사용/인스턴스화 시점이 아닌 템플릿 정의의 맥락에서 발생합니다. 템플릿의 템플릿베이스 클래스가 보이지만 템플릿 클래스이기 때문에 사용될 수있는 특정 인스턴스화에는 특수 템플릿이 포함될 수 있으므로 기본 클래스 템플릿 정의를 이름 조회에 사용할 수 없습니다.
표현을 변경하여 this->x
당신은 그것을 의존적 표현으로 만들고 있습니다 (this
클래스 템플릿에서는 항상 템플릿 매개 변수에 따라 다릅니다). 이는 인스턴스화 컨텍스트에서 조회가 발생할 것이며,이 시점에서 기본 클래스가 완전히 알려지고 멤버가 보입니다.
다른 팁
파생 템플릿을 정의 할 때 컴파일러는 기본 템플릿 클래스의 이름 만 알고 있지만 세부 사항은 아님을 알고 있으므로 컴파일러는 파생 클래스에 상속 된 멤버가 있음을 알지 못합니다. 회원의 존재를 컴파일러에게 알리기 위해 사용하십시오. this->
, 당신처럼.
실제로, 그것은의 복제입니다 이 질문.