2015-10-18 7 views
4

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

template<typename ...Args> 
using Function = void(*)(Args *...); 

template<typename ...Args> 
void DoThing(Function<Args...> func) { } 

void IntFunction(int *i) { } 

int main(int argc, char *argv[]) { 
    DoThing(IntFunction); 
} 

Когда я запускаю программу, я получаю эту ошибку

$ clang++ -std=c++14 template.cpp 
template.cpp:12:3: error: no matching function for call to 'DoThing' 
    DoThing(IntFunction); 
    ^~~~~~~ 
template.cpp:7:6: note: candidate template ignored: substitution failure [with Args = int] 
void DoThing(Function<Args...> func) { } 
    ^
1 error generated. 

Но если я скомпилировать его с помощью г ++ Я не получить какие-либо ошибки.

Похоже, что clang испытывает проблемы с выводом параметров вариационного шаблона при использовании в псевдониме типа. Если заменить переменные параметры на стандартные, то я больше не получаю ошибку.

Какой компилятор дает мне правильный результат? И почему мне не разрешат это делать?

+1

Код выглядит хорошо для меня. [Компиляция с gcc] (http://rextester.com/OIOL58947) и с VC2015. Похож на проблему с clang. –

ответ

0

Может быть уменьшена до

template <typename... T> 
using funptr = void(*)(T...); 

template <typename... T> 
void f(funptr<T...>) {} 

template void f(void(*)()); 

Это правильный код; если мы заменим funptr<T...> соответствующим расширением пакета, Clang вдруг больше не жалуется.

Зарегистрировано как #25250.

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

  • Нет связанных вопросов^_^