Должен ли шаблон функции базового класса быть назначен на указатель на член-функцию

Должен ли следующий код компилироваться в C++98/03?

struct Base
{
    template <typename T> void func () { }
    void norm() {  }
};

struct Derived : public Base { };

template <typename U>
struct Usage
{
    typedef void (U::*Method)();

    Usage(Method test) { }
};

int main()
{
    Usage<Derived> good(&Derived::norm);

    // "Error: Cannot use void(*)() to initialize Usage<Derived>." on next line
    Usage<Derived> bad(&Derived::func<int>);

    return 0;
}

Этот фрагмент кода отлично работал почти на каждом компиляторе, который я смог опробовать; сохранить Sun C++ 5.11 и Sun C++ 5.12.

Это должно быть ошибка? Если так, кто-нибудь знает, было ли это сообщено поставщику (в настоящее время Oracle)?

Редактировать:

Я приму ответ, который обеспечит соответствующие цитаты из документов стандартов C++03 или C++ 11. Или, если вы можете предоставить информацию об ошибке в Oracle.

1 ответ

Я только что прочитал большую часть стандарта C++98, глава 14. На самом деле не очень много сказано о том, какой тип является результирующим (специализированным) элементом шаблона, поэтому я предполагаю, что из этого следует, что метод шаблона не создает это ни в коем случае не метод. Если бы у меня был момент, я посмотрю, скажет ли C++11 больше об этом.

Из моего общего представления о C++ я знаю, что ваш код должен пройти - и большинство компиляторов, согласившихся с этим, также является ключом, не так ли?:)

Другие вопросы по тегам