использование псевдонима типа при разбиении класса шаблона на заголовок и файл реализации - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть шаблонный класс, который разбит на файл .hpp и .ipp, который имеет довольно длинный тип.Во время рефакторинга я хотел написать псевдоним типа для этого типа, чтобы код мог быть намного более читабельным.Но независимо от того, что я делаю, я не могу распознать псевдоним типа в файле .ipp.

Вот простой пример того, что я пытаюсь сделать:

container.hpp:

template <class T>
class container {
public:
    using TypeAlias = T;
    container(const TypeAlias& a);
    const TypeAlias& getA() const;
private:
    TypeAlias a;
};

#include "container.ipp"

container.ipp:

template <class T>
container<T>::container(const TypeAlias& a) : a(a)
{

}

template <class T>
const TypeAlias& container<T>::getA() const
{
    return this->a;
}

При компиляции возникает следующая ошибка:

./container.ipp:8:7: error: unknown type name 'TypeAlias'
const TypeAlias& container<T>::getA() const

Очевидно, что в этом случае это не так многосмысл вводить TypeAlias, но в моей реальной программе это может иметь огромное значение.Что я могу сделать, чтобы TypeAlias ​​был доступен в файле .ipp?

1 Ответ

0 голосов
/ 10 ноября 2018

Когда вы определяете члена класса, например container<T>::getA, вещи после имени члена (getA здесь) ищутся в области видимости класса, а вещи до него - нет. По сути, если компилятор пытается понять вещи по порядку, когда объявление начинается с const TypeAlias&, он еще не знает, что ему следует заглянуть внутрь container<T>, чтобы выяснить, что может означать TypeAlias.

Таким образом, используя обычный синтаксис функции, вам нужно будет указать, что TypeAlias является типом члена:

template <class T>
const typename container<T>::TypeAlias& container<T>::getA() const
{
    return this->a;
}

Но это одно из преимуществ синтаксиса «конечный тип возврата» (действует в C ++ 11 и более поздних версиях): просто изменяя порядок вещей, он позволяет более просто использовать члены класса в возвращаемом типе:

template <class T>
auto container<T>::getA() const -> const TypeAlias&
{
    return this->a;
}
...