Должен ли следующий код компилироваться в 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.
Я только что прочитал большую часть стандарта C ++ 98, глава 14. На самом деле не очень много сказано о том, какой тип является результирующим (специализированным) элементом шаблона, поэтому я предполагаю, что из этого следует, что метод шаблона не создает это ни в коем случае не метод. Если бы у меня был момент, я посмотрю, скажет ли C ++ 11 больше об этом.
Из моего общего представления о C ++ я знаю, что ваш код должен пройти — и большинство компиляторов, согласившихся с этим, также является ключом, не так ли? 🙂
Других решений пока нет …