Шаблон базового класса typedef members невидимый

Мне известно о том, что "зависимые имена" по умолчанию не отображаются компилятору. Но мне ответили на другие вопросы SO (здесь, здесь, и в конечном итоге в С++ faq), что может помочь объявление using.

Итак, я попробовал.

Базовый класс шаблона:

// regardless of the fact that members are exposed...
template<typename T>
struct TBase {
   typedef T MemberType;
   MemberType baseMember;
   MemberType baseFunction() { return MemberType(); }
};

И производный класс, используя базовые элементы:

template<typename T>
struct TDerived : public TBase<T> {
   // http://www.parashift.com/c++-faq-lite/nondependent-name-lookup-members.html
   // tells us to use a `using` declaration.
   using typename TBase<T>::MemberType;
   using TBase<T>::baseFunction;
   using TBase<T>::baseMember;

   void useBaseFunction() { 
      // this goes allright.
      baseFunction();
      ++baseMember;

      // but here, the compiler doesn't want to help...
      MemberType t; //error: expected `;' before ‘t’
   }
};

Я попробовал это на идее. Он имеет gcc-4.3.3 и gcc-4.5.1

Является ли это ожидаемым поведением? Как мы должны работать над законом "зависимого имени" для доступа к типовым элементам родительского шаблона?

Ответ 1

Вы, вероятно, захотите сделать:

using MemberType = typename TBase<T>::MemberType; // new type alias syntax

или

typedef typename TBase<T>::MemberType MemberType; // old type alias syntax

Синтаксис using Base::member; может использоваться только для приведения объявлений нестерических элементов в область видимости.


Также обратите внимание, что ни одно из них не требуется, вы можете квалифицировать каждое использование (для типов с базой, для не-типов с помощью this-> или базы), и это сделает символ зависимым.