2013-05-08 3 views
4

Когда я объявляю шаблонный шаблон класса шаблона, тип аргумента которого задается псевдонимом шаблона, я получаю ошибку компиляции. Если я изменил класс шаблона на класс, он скомпилируется. Если я заменил псевдоним шаблона на фактический тип (здесь 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>; 

ответ

3

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

В шаблоне шаблона нет семантической разницы между классом и typename.

+0

подтверждаю, что. Я тестировал gcc версии 4.7.3, и он компилируется отлично. – user2360448

+1

Я зарегистрировал [отчет об ошибке] (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57222). – user2360448

Смежные вопросы