Почему не работает и выдает ошибки С2923 С2061 С2238

template <typename _Ty, typename Allocator = std::allocator<_Ty> >
class C
{
private:

    struct Node
    {
        _Ty Data;
        Node* Next;
    };
    Allocator::rebind<C<_Ty>::Node>::other a;
    Node* head;
public:
    C() {}
    ~C() {}
};

int main()
{
    C<int> c;
    return 0;
};

Выдает ошибку c rebind : Ошибка C2061 синтаксическая ошибка: идентификатор "other". Ничего не понимаю. Подскажите пожалуйста, где ошибка

template <typename _Ty, typename Allocator = std::allocator_traits<std::allocator<_Ty>> >
class C
{
private:

    struct Node
    {
        _Ty Data;
        Node* Next;
    };
    Allocator::rebind_alloc<C<_Ty>::Node> a;

    Node* head;
public:
    C() {}
    ~C() {}
};

int main()
{
    allocator_traits<allocator<int>>::rebind_alloc<char> a;
    C<int> c;
    return 0;
};

такая штука к сожалению тоже не работает и выдает :

Ошибка C2061 синтаксическая ошибка: идентификатор "rebind_alloc"


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

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

...>::other и ...>::Node являются зависимыми именами и по-умолчанию парсятся как имя переменной или функции, чтобы этого избежать необходимо в начале добавить typename. Однако в данном случае это не особо поможет, std::allocator::rebind устарел и удален из текущей версии языка. Также C<_Ty> может не совпадать с текущим экземпляром шаблона, а имена, начинающиеся с _, за которой идет заглавная буква, зарезервированы, а для std::allocator требуется соответствующий include, а ; после окончания функции излишне.

→ Ссылка