Вызов функции аргумента с переменным значением из класса шаблона - PullRequest
5 голосов
/ 02 апреля 2012

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

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 специализируется, я могу без проблем вызвать функцию-член шаблона () (). Но если я попытаюсь вызвать его из функции или структуры, которая не специализируется на foo, gcc (4.7) выдаст ошибку, говорящую "пакеты параметров не расширены с помощью ...". Я попробовал то же самое с clang (3.1), но получил похожую ошибку («ошибка: выражение содержит нерасширенный пакет параметров« I »»).

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

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

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

1 Ответ

6 голосов
/ 02 апреля 2012

Собираюсь собирать реп ...

foo<T>().template run<I...>();

См. Где и почему я должен поставить ключевые слова "template" и "typename"? , почему необходимо ключевое слово template.

...