Должен ли шаблон функции базового класса быть назначен на указатель на член-функцию
Должен ли следующий код компилироваться в 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++ я знаю, что ваш код должен пройти - и большинство компиляторов, согласившихся с этим, также является ключом, не так ли?:)