Я просто потратил пару часов на отладку ошибки компилятора, которую я мог бы исправить немедленно, если бы сообщение об ошибке компилятора было более полезным.
Я сократил это до простого примера:
template <typename T>
int f(int);
template <typename U>
auto g(U x) -> decltype(f(x));
int main()
{
g(0);
}
Ошибка:
test.cpp: In function 'int main()':
test.cpp:9:8: error: no matching function for call to 'g(int)'
test.cpp:9:8: note: candidate is:
test.cpp:5:29: note: template<class U> decltype (f(x)) g(U)
Не является ли эта ошибка в лучшем случае вводящей в заблуждение, а в худшем - ошибочной? На мой взгляд, проблема в не в том, что данное определение g не соответствует вызову, а в том, что определение искажено (поскольку в выражении f (x) в decltype оно пытается вызвать f без указания параметра шаблона f).
Не будет ли гораздо более разумное сообщение об ошибке чем-то вроде:
no matching function for call to 'f(int)' in 'decltype(f(x))'
in instantiation of 'g(U)' with U = int
или даже лучше:
failed to deduce template parameter 1 in call to 'f(int)' in 'decltype(f(x))'
in instantiation of 'g(U)' with U = int
Я бы ожидал что-то подобное ...