Подтвердить что ты не робот

Переменная класса шаблона с параметром шаблона класса шаблона, установленным на базовый шаблон производного шаблона с переменной

Я пытаюсь получить производный класс (обычный шаблон), который имеет переменную типа шаблона, которая имеет в качестве параметра своего шаблона тип базового класса (обычный шаблон, тот же параметр, что и производный класс) (тот, у кого есть переменная). Это делает VС++ невероятно зол на меня, и я неспособен успокоить его ярость. Вот краткий пример:

template<template<typename VT> class CT, typename VT> struct encapThing {};

template<typename VT> struct innocuousBase {};

template<typename VT> struct derivOfDoom : public innocuousBase<VT>
{
    encapThing<innocuousBase, VT> ohgodhelp; //C3200
};

Он бросит C3200, заявив, что ожидает шаблон класса. Теперь я понимаю, почему это может означать, что в шаблонах есть рекурсивный цикл шаблонов, даже если это не так. Как я могу убедить VС++ иначе?

4b9b3361

Ответ 1

Неквалифицированное использование innocuousBase внутри derivOfDoom<> интерпретируется как innocuousBase<VT>, так как неквалифицированное использование derivOfDoom в этом контексте будет интерпретироваться как derivOfDoom<VT>. Я не помню, насколько это стандартно-совместимое поведение, но обходное решение тривиально: полностью квалифицируйте innocuousBase, поэтому компилятор знает, что вы ссылаетесь на шаблон класса innocuousBase, а не на базовый класс innocuousBase<VT>

template<typename VT> struct derivOfDoom : innocuousBase<VT>
{
    encapThing<::innocuousBase, VT> ohgodhelp;
};