문제

여기에 오래된 코드베이스가 있는데, 여기서 보호 된 멤버 변수를 사용했습니다. 이것이 좋은 아이디어인지 아닌지에 대해 논의 할 수 있습니다. 그러나 코드는 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->, 당신처럼.

실제로, 그것은의 복제입니다 이 질문.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top