Я изучал удаление неиспользованных перегрузков и вызвал ошибку компиляции, которая, по словам компилятора, была ошибкой замены шаблона. Но я думал, что «сбой замены не является ошибкой», и в любом случае, зачем удалить перегрузку?#include
int ParseInt(const char *);
int ParseInt(std::string);
bool F(int(*)(const char *));
bool User() {
return F(ParseInt);
}
< /code>
Здесь, user () звонит f с адресом подготовки анализа. Все хорошо. Parseint перегружен, но только одна перегрузка соответствует подписи F. < /P>
Введите шаблон перегрузки F: < /p>
bool F(int(*)(const char *));
template
struct MetaDeduce {
typedef typename T::X type;
};
template
typename MetaDeduce::type F(const T&);
< /code>
Теперь есть эта странная перегрузка F, но это нормально, потому что в указанах функций нет участников именованных в любом случае. Все компилируется, все хорошо.#include
int ParseInt(const char *);
// int ParseInt(std::string); // commenting this out caused a compiler error!
bool F(int(*)(const char *));
template
struct MetaDeduce {
typedef typename T::X type;
};
template
typename MetaDeduce::type F(const T&);
bool User() {
return F(ParseInt);
}
< /code>
Как можно увидеть на Godbolt, это создает странную ошибку компиляции: < /p>
10 : error: type 'int (const char *)' cannot be used prior to '::'
because it has no members
typedef typename T::X type;
^
14 : note: in instantiation of template class 'MetaDeduce'
requested here
typename MetaDeduce::type F(const T&);
^
< /code>
wtf ??? Похоже, что компилятор жалуется на неудачу замены, но почему это не было проблемой раньше? И в любом случае, я думал, что сбой замены не была ошибкой! Что происходит?
Подробнее здесь: https://stackoverflow.com/questions/349 ... pile-error