Возможные формы аргумента шаблона шаблона в экземпляре шаблона
Одной из возможных форм параметра шаблона является шаблон класса. Стандарт C++ (C++2003) утверждает, что аргумент для параметра шаблона шаблона во время создания экземпляра шаблона является "ID-выражением". Этот нетерминал довольно широк. Он позволяет использовать деструкторы, перегруженные операторы и т. д. Например, следующий код должен хорошо компилироваться:
template <template <typename x> class T>
struct MyClass
{
T<int> a;
T<double> b;
};
template <typename x> struct Helper
{
~Helper() { }
x operator+(x p) { return(x[1]+p); }
x[4] c;
};
MyClass<Helper> p1;
MyClass<~Helper> p2;
MyClass<Helper::operaror+> p3;
Последние 2 строки не имеют никакого смысла. Но с точки зрения грамматики они прекрасны. Грамматика не является (и должна быть не) точно описать язык, но в пункте 14.3.3 "аргумент шаблона шаблона" не упоминаются какие-либо ограничения на правила грамматики в этом контексте.
Может ли кто-нибудь принять или опровергнуть мои утверждения:
- аргумент шаблона шаблона может быть только идентификатором, возможно, квалифицированным.
- Если первый пункт верен, это определенно стоит упомянуть в стандарте.
1 ответ:
14.3 [темп.arg] p1
"Существует три формы шаблона-аргумента, соответствующие трем формам шаблона-параметра: тип, нетип и шаблон. Тип и форма каждого template-argument , указанного в template-id, должны соответствовать типу и форме, указанным для соответствующего параметра, объявленного шаблоном в его списке template-parameter-list.
Аргумент
~Helper
не имеет правильного типа для шаблона параметр шаблонаtemplate<typename> class T
, это не шаблон класса.14.3.3 [темп.аргумент.шаблон] p1
Atemplate-argument для шаблонаtemplate-parameter будет именем шаблона класса, выраженным какid-выражение .
Это довольно ясно исключает ваши примеры.
~Helper
не является именем шаблона класса.