Одной из возможных форм параметра шаблона является шаблон класса. В стандарте 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 «Аргумент шаблона шаблона» не упоминаются какие-либо ограничения на правила грамматики в этом контексте.
Кто-нибудь может принять или опровергнуть мои утверждения:
- Аргумент шаблона шаблона может быть ТОЛЬКО идентификатором, возможно, уточненным.
- Если пункт один верен, это определенно стоит упомянуть в стандарте.