문제

나는 기본 수업이 있습니다 BassClass, 일부 필드와 함께 보호를 받았으며 순수한 가상 기능. 그런 다음 파생 클래스는 말합니다 DerivedClass, 처럼 class DerivedClass : public BassClass. 파생 된 클래스가 Bassclass에서 보호 된 필드를 상속해서는 안됩니까? DerivedClass를 컴파일하려고 할 때 컴파일러는 DevivedClass가 해당 필드가 없다고 불평합니다. 여기에 무엇이 잘못 되었습니까? 감사해요

도움이 되었습니까?

해결책

만약에 BassClass (sic) 및 DerivedClass 템플릿이고 BassClass 액세스하려는 회원 DerivedClass 종속 이름으로 지정되지 않으므로 표시되지 않습니다.

예를 들어

template <typename T> class BaseClass {
protected: 
    int value;
};

template <typename T> class DerivedClass : public BaseClass<T> {
public:
    int get_value() {return value;} // ERROR: value is not a dependent name
};

액세스를 얻으려면 더 많은 정보를 제공해야합니다. 예를 들어, 회원의 이름을 완전히 지정할 수 있습니다.

    int get_value() {return BaseClass<T>::value;}

또는 클래스 멤버를 언급하고 있음을 명시하게 만들 수도 있습니다.

    int get_value() {return this->value;}

다른 팁

이것은 작동합니다 :

#include <iostream>

struct Base {
virtual void print () const = 0;
protected:
int val;
};

struct Derived : Base {
void print () { std::cout << "Bases's val: " << val << std::endl; }
};
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top