Поиск зависимого имени в шаблоне базового класса - PullRequest
0 голосов
/ 25 октября 2018

Я понимаю, что поиск зависимого 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)) { ... }

1 Ответ

0 голосов
/ 25 октября 2018

Проблема возникнет только в том случае, если возникнут разногласия относительно значения имени участника.До тех пор, пока имя определяет только база, проблем не будет, но если производный тип переопределит его как нечто другое, будет выбран производный член.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...