2012-01-21 3 views
1

Следующий код не скомпилирован с gcc 4.7 (20120114), но компилируется с clang ++ 3.0. Это ошибка в gcc, clang или просто потому, что то, что я пытаюсь сделать, не разрешено в C++ 11?Вложенные вариативные шаблоны: ошибка в gcc или clang?

template< typename... args > 
struct A { 
    template< typename head, typename... tags > 
    struct Inner : public Inner<tags...> { 
    }; 

    template< typename head > 
    struct Inner<head> { 
     // assume both args... and tags... must be used to 
     // calculate TYPE 
     typedef int TYPE; 
    }; 
}; 

template< typename... args > 
struct B : A<args...> { 
    template<typename... tags> 
    typename A<args...>::template Inner<tags...>::TYPE x() { 
     return 0; 
    } 
}; 

int main(int argc, const char *argv[]) { 
    B<int, int, int> b; 
    b.x<char, short, long, double>(); 

    return 0; 
} 

Код выше очень упрощенный пример того, что я пытаюсь сделать, но суть в том, что мне нужно обе арг ... типы и теги ... типы вычислить тип возвращаемого значения функция. Как это может быть сделано?

ответ

3

Не уверен, если это ошибка НКУ или нет, но это стандартное решение, чтобы сделать его компиляции на GCC является объявить пустой VARIADIC версию, а затем специализироваться его:

template <typename... T> 
struct Inner; 
template <typename Head, typename... Rest> 
struct Inner<Head, Rest...> : public Inner<Rest...> { ... }; 

Демо: http://ideone.com/MFKVY

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