Удаление неиспользованной перегрузки вызывает ошибку компиляции?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Удаление неиспользованной перегрузки вызывает ошибку компиляции?

Сообщение Anonymous »

Я изучал удаление неиспользованных перегрузков и вызвал ошибку компиляции, которая, по словам компилятора, была ошибкой замены шаблона. Но я думал, что «сбой замены не является ошибкой», и в любом случае, зачем удалить перегрузку?#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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»