Рассмотрим следующий код ( live demo ):
class Foo
{
public:
void method();
};
template <typename T> struct Member;
template <typename T> struct Member<void (T::*)()>
{
using Object = T;
};
template <typename T> class Pointer
{
public:
operator T*();
};
template <typename Func>
void bar(typename Member<Func>::Object*, Func) {}
void test()
{
Pointer<Foo> p;
bar(p, &Foo::method);
}
Это компилируется с G CC ≥ 4.9, но G CC 4.8 не знает, чтобы вызвать оператор преобразования:
error: no matching function for call to 'bar(Pointer<Foo>&, void (Foo::*)())'
bar(p, &Foo::method);
note: candidate is:
note: template<class Func> void bar(typename Member<Func>::Object*, Func) void bar(typename Member<Func>::Object*, Func) {}
note: template argument deduction/substitution failed:
note: mismatched types 'typename Member<Func>::Object*' and 'Pointer<Foo>'
bar(p, &Foo::method);
Почему? Это ошибка? Это новая функция в C ++ 14? Пожалуйста, приведите, пожалуйста, либо функцию C ++, либо сообщение об ошибке G CC.
Спасибо!
(Примечание: у меня есть обходной путь для моего реального кода, мне просто интересно, что изменилось в компиляторе ...)