Вложенные шаблоны variadic: ошибка в gcc или clang? - PullRequest
1 голос
/ 21 января 2012

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

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;
}

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

1 Ответ

3 голосов
/ 21 января 2012

Не уверен, является ли это ошибкой в ​​gcc или нет, но стандартное решение для его компиляции в gcc - объявить пустую переменную версию и затем специализировать ее:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...