Описание тега dependent-name

Зависимое имя C++ - это имя, которое зависит от аргумента шаблона. Независимое имя не зависит от аргументов шаблона. Компилятор разрешает эти два типа имен в разные моменты времени.

В шаблонах возникает вопрос о зависимых и независимых именах. Два экземпляра одного и того же шаблона класса могут иметь разные члены, разные типы. Имена, зависящие от аргумента шаблона, являются зависимыми именами. Имена, которые не являются независимыми именами. Компилятор разрешает независимые имена в точке, где определен шаблон. Разрешение зависимых имен откладывается до момента, когда создается экземпляр шаблона.

Это может привести к странным ошибкам компиляции:

template <class T> class A
{
protected:
   A(T v) : x(v) {}
   T f() { return x; }
private:
   T x;
};

template <class T> class B : public A<T>
{
public:
   B() : A<T>(42) {}
   T g () { return f(); } // Compilation error
};

Вышеупомянутое не может быть скомпилировано из-за независимого использования f в B::g(). Решение состоит в том, чтобы превратить это независимое имя в зависимое имя. Использование объявления using (using A<T>::f;), используя полное имя (return A<T>::f();) или явно используя this (return this->f();) - три способа превратить неквалифицированных, независимых f в зависимое имя.