#include <iostream>

class Base {
 public:
  void m1() { std::cout << "Base::m1\n"; }
  // ...
};

template<class T>
class Derived : public T { // dependent base class
 public:
  void test1() {
#ifdef ERR
      m1(); // error: there are no arguments to `m1' that depend on a template parameter, 
            //        so a declaration of `m1' must be available
#endif
  }
  void test2() {
      this->m1();  // O.K. with this
  }
  // ...
};

int main() {
    Derived<Base> o;
    std::cout << "main:\n";
    o.test1();
    o.test2();
}