https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66670
Marc "Foddex" Oude Kotte <foddex at foddex dot net> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |foddex at foddex dot net --- Comment #2 from Marc "Foddex" Oude Kotte <foddex at foddex dot net> --- I have a similar problem with only one parameter pack, that I think is closely related to this bug. The following code does not work with gcc 8.1.1, gcc 8.2 and Apple LLVM version 9.1.0, but does work with MSVC 2017 15.8.4 and icc 18.0.0 (as checked with https://godbolt.org) template<typename _Object, typename ..._Parameters> static void whatever(_Object*, void(_Object::*method)(_Parameters..., float)) {} struct Foobar { void myMethod(bool, float); }; int main(int argc, char** argv) { Foobar f; whatever<Foobar, bool>(&f, &Foobar::myMethod); } When compiled with -std=c+=14, gcc's output is: <source>: In function 'int main(int, char**)': <source>:10:49: error: no matching function for call to 'whatever<Foobar, bool>(Foobar*, void (Foobar::*)(bool, float))' whatever<Foobar, bool>(&f, &Foobar::myMethod); ^ <source>:2:13: note: candidate: 'template<class _Object, class ... _Parameters> void whatever(_Object*, void (_Object::*)(_Parameters ..., float))' static void whatever(_Object*, void(_Object::*method)(_Parameters..., float)) {} ^~~~~~~~ <source>:2:13: note: template argument deduction/substitution failed: <source>:10:49: note: mismatched types 'float' and 'bool' whatever<Foobar, bool>(&f, &Foobar::myMethod); ^ Note that the following version of the above code DOES work perfectly, on all aforementioned mentioned compiler versions. template<typename _Object, typename ..._Parameters> static void whatever(_Object*, void(_Object::*method)(float, _Parameters...)) {} struct Foobar { void myMethod(float, bool); }; int main(int argc, char** argv) { Foobar f; whatever<Foobar, bool>(&f, &Foobar::myMethod); } The difference is that in the first version, the parameter pack comes first, and then the fixed float parameter, while in the second version, the float comes first, and then the parameter pack. Hope this helps