Почему это преобразование типов [не] работает? - PullRequest
2 голосов
/ 30 марта 2020

Рассмотрим следующий код ( 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.

Спасибо!

(Примечание: у меня есть обходной путь для моего реального кода, мне просто интересно, что изменилось в компиляторе ...)

...