Я понимаю, что поиск зависимого member/typedef
не будет выполняться на зависимом шаблоне базового класса, и что мне нужно явно префиксом this->member
в случае базового члена или typename base<T...>::sometype
дляtypedef/using
в базовом классе.
Все ответы, которые я могу найти, предлагают использовать typename base<T...>::sometype
.Очевидно, что это может быть typedef в производном классе, например using base_type = base<T...>
, а затем typename base_type::some_type
везде, но для этого требуется повторение аргументов базового класса как в производном, так и в typedef.
Однако, похоже, он работает, когда я использую derived::sometype
, вместо того, чтобы указывать базовый класс. например
template <typename T>
struct base
{
using type = T*;
};
template <typename T>
struct derived : base<T>
{
derived ()
{
typename derived::type l; // <- Here
}
};
int main() {
derived <int> v;
return 0;
}
Это позволяет мне использовать injected class name
и, что важно, экономит мне любое повторение аргументов шаблона в любом месте, кроме определения класса и базового вывода.
Из этого ответа мне кажется, что компилятору просто нужно знать, что имя является зависимым именем, чтобы поиск выполнялся на втором этапе, и с использованием производногоимя, кажется, служит для этой цели?
Поскольку все ответы, которые я нашел, предлагали использовать base<T...>
для зависимых имен, мне интересно знать, есть ли проблемы с использованием injected class name
для доступа к зависимым типам вбаза?
Редактировать:
Похоже, имя базового класса также вводится, и поэтому using base_type = derived::base;
- это все, что нужно для того, чтобы не повторять базовый класс.типы.По крайней мере, когда имя базового класса известно.
Интересно, что было предложение в 2009 году, чтобы иметь возможность псевдонимов базовых классов, что решило бы проблему, когда имя базового классакласс не известен, или несколько специализаций одной и той же базы были унаследованы от.Хотя предложение было отклонено, сказав: «Поощряйте автора статьи идти в направлении более общего решения».
Обсуждая это в другом месте, было высказано предположение, что нечто подобное даст более общее решение и позволит основамбыть псевдонимом и использовать их введенное имя.Однако, насколько я знаю, это не было предложено.
template <typename T> using TD = typename std::decay<T>, using std::swap
void fun(TD x) noexcept(swap(x, x)) { ... }