#include <iostream>
#include <cassert>

template <typename T>
class Base {
public:
    int _size = 10;
};

template <typename T>
class Derived : public Base<T> {
public:
    void printSize() {
        // std::cout << _size << "\n"; //  Error: _size is unqualified and lookup fails
        std::cout << this->_size << "\n";             // OK: via 'this' makes it dependent
        std::cout << Base<T>::_size << "\n";          // OK: qualified name also works
    }

    void checkIndex(int ix) {
        // assert(ix >= 0 && ix < _size); //  Error without qualification
        assert(ix >= 0 && ix < this->_size);          //  OK
        std::cout << "Index " << ix << " is valid.\n";
    }
};

int main() {
    Derived<int> d;
    d.printSize();       // Output: 10 (twice)
    d.checkIndex(5);     // Output: Index 5 is valid.
}