базовый класс шаблона typedef члены невидимые

Мне известно о том, что «зависимые имена» не видны компилятору по умолчанию. Но мне сказали в ответах на другие ТАК вопросы (Вот, Вот, и в конечном итоге на C ++ часто задаваемые вопросы) это 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’
}
};

Я старался это на Ideone. Имеет gcc-4.3.3 и gcc-4.5.1

Это ожидаемое поведение? Как мы должны работать вокруг закона «зависимого имени» для доступа к родительскому шаблонному классу? Typedefs члена?

13

Решение

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

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

или же

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

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


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

19

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector