Вы не можете вернуть массив из функции, поэтому создание экземпляра шаблона завершается неудачно, и нет соответствующей функции.
Вы получаете эту конкретную ошибку из-за SFINAE - Это на самом деле не ошибка, чтокомпилятор не может создать экземпляр вашей функции, он является ошибкой из-за отсутствия соответствующей функции.
Вы можете вернуть ссылку на массив - возврат T const &
будет работать.
РЕДАКТИРОВАТЬ: В ответ на комментарии:
Во-первых, это на самом деле хороший пример SFINAE.
template<typename T> T f(const T &item) { return item; }
char const * f(void const * item) { return 0; }
int main() {
f("abc");
}
Когда компилятор это компилирует, он сначалапопытайтесь создать экземпляр шаблона f, чтобы создать точное совпадение для типа const char [3]
.Это не удается по указанным причинам.Затем он выберет неточное совпадение, обычную функцию и при вызове затухает от const char [3]
до const char *
.