Вызов функции с переменным аргументом из класса-шаблона

У меня есть класс-шаблон с функцией-членом шаблона с переменным числом аргументов, которую я не могу вызывать извне класса. Это упрощенный пример того, что я пытаюсь сделать.:

template<typename T>
struct foo{
    foo(){}

    template<int... I>
    int run(){
        return sizeof...(I); // or whatever
    }
};

template<int... I>
int run_int(){
    return foo<int>().run<I...>();  // OK
}

template<typename T, int... I>
int run_T(){
    return foo<T>().run<I...>(); // error
}

Когда foo является специализированным, я могу без проблем вызвать его функцию-член шаблона run(). Но если я попытаюсь вызвать его из функции или структуры, которые не специализируются на foo, gcc(4.7)выдает ошибку, говорящую о том, что «пакеты параметров не расширены с помощью ‘…’». Я попробовал то же самое с clang (3.1), но получил аналогичную ошибку ("выражение ошибки :содержит нерасширенный пакет параметров 'I'" ).

Может ли кто-нибудь помочь мне понять, почему последняя функция не компилируется? На данный момент я могу обойти это, сделав "int...I" параметром не-типа самого foo, а затем вызвать его таким образом извне :

 foo<T, I...>().run()

, но я все еще озадачен тем, почему он не компилируется другой способ.

5
задан Nicol Bolas 2 April 2012 в 07:42
поделиться