Я пытаюсь написать вариант template class defining a super
type idiom. Класс Inherit
вводит тип Super
, чтобы обозначить, возможно, очень длинный супер-тип, а также должен знать производный тип New
, чтобы сделать некоторые дополнительные вещи, которые я здесь не показываю.C++ не может найти тип, определенный в базовом классе шаблона, который наследует от текущего класса шаблона
Это работает отлично, если тип, переданный в New
, не является шаблоном, но не с шаблонами. Вот полный пример компилируется с clang++-3.8 -std=c++1y -Wall
(НКУ дает тот же результат):
struct SomeBase {};
template<class New, class Base>
struct Inherit : Base {
using Super = Inherit<New, Base>;
};
struct NonTemplate : Inherit<NonTemplate, SomeBase> {
using X = Super;
// compiles and is nice and short
};
template<class T>
struct Template : Inherit<Template<T>, SomeBase>
{
using A = Super;
// error: unknown type name 'Super'; did you mean 'NonTemplate::Super'?
using B = typename Super;
// error: expected a qualified name after 'typename'
using C = Inherit::Super;
// error: 'Inherit' is not a class, namespace, or enumeration
using D = typename Inherit<Template<T>, SomeBase>::Super;
// compiles, but what's the point?
};
int main() {
return 0;
}
Если мне не нужен параметр New
Я также возможность использовать Inherit
с шаблонами, но мне действительно нужно New
. Я мог бы скомпилировать код, используя опцию D
, но это побеждает всю цель.
У меня есть два вопроса:
- Что именно проблема языка, который предотвращает имя типа
Super
от известности внутри классаTemplate
и почему это отличается вNonTemplate
случае? - Есть ли у кого-нибудь идеи для хорошего решения этой проблемы?
В зависимости от названия ... 'Inherit , SomeBase>' может иметь некоторую специализацию, которая может изменить значение 'Super'. – Jarod42