Псевдоним шаблона не работает в аргументе шаблона шаблона класса

Когда я объявляю метод шаблона класса шаблона, тип аргумента которого определяется псевдонимом шаблона, я получаю ошибку компиляции. Если я изменяю класс шаблона на класс, он компилируется. Если я заменю псевдоним шаблона фактическим типом (здесь Templ<bool>), он тоже компилируется. Почему это не работает, когда это шаблон класса а также тип аргумента является псевдонимом шаблона?

Компилятор gcc версии 4.8.0 (Ubuntu / Linaro 4.8.0-2ubuntu2 ~ 12.04).

template <template <typename T> class Templ>
using Bool = Templ<bool>;

template <typename T>
class Foo {
private:
public:
template<template<typename U> class Templ>
void method(Bool<Templ> boolTempl);
};

template <typename T>
template <template <typename U> class Templ>
void Foo<T>::method(Bool<Templ> boolTempl) {
}

int main() {
Foo<char> foo;
return 0;
}

g++ templTest12.C -o templTest12 -std=c++11
templTest12.C: In substitution of `template<template<class T> class Templ> using Bool = Templ<bool> [with Templ = Templ]':
templTest12.C:17:6:   required from `class Foo<char>'
templTest12.C:30:12:   required from here
templTest12.C:2:25: error: `template<class U> class Templ' is not a template
using Bool = Templ<bool>;

4

Решение

Похоже, что это регрессия в gcc 4.8.0, потому что gcc 4.7.2 компилирует обе версии без ошибок. Стандарт 14.1 / 2 специально гласит, что

Там нет семантической разницы между классом и typename в
Шаблон-параметры.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]