Как при помощи using объявить тип-член внутри шаблонного класса?

Рассмотрим следующий код:

class A
{
    public:
    using Uptr = std::unique_ptr<A>;
};

class B
{
    public:
    A::Uptr a;
};

Это классический подход снабдить тип дополнительным подтипом-членом для удобства работы.

Когда я пытаюсь реализовать это для шаблонных A и B, компилятор говорит мне, что я сильно неправ:

template <typename T>
class A
{
    public:
    using Uptr = std::unique_ptr<A<T>>;
};

template <typename T>
class B
{
    public:
    A<T>::Uptr a;// Error
};

Скажите, почему так происходит, и что с этим можно сделать?


Ответы (1 шт):

Автор решения: user393643

Надо указать typename, потому что компилятор не знает, что A<T>::Uptr это тип, а не член класса.

#include <memory>
#include <iostream>

template <typename T>
class A
{
    public:
    using Uptr = std::unique_ptr<A<T>>;
};

template <typename T>
class B
{
    public:
    typename A<T>::Uptr a;
};

int main() {
    B<int> b;
}
→ Ссылка