Бесполезное (возможно, неправильное?) Сообщение об ошибке gcc - PullRequest
1 голос
/ 23 января 2011

Я просто потратил пару часов на отладку ошибки компилятора, которую я мог бы исправить немедленно, если бы сообщение об ошибке компилятора было более полезным.

Я сократил это до простого примера:

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

Я бы ожидал что-то подобное ...

Ответы [ 2 ]

1 голос
/ 23 января 2011

С Clang я получаю эту ошибку

C:\Users\SUPER USER\Desktop>clang++ -cc1 -std=c++0x aa.cpp
aa.cpp:9:5: error: no matching function for call to 'g'
    g(0);
    ^
aa.cpp:5:6: note: candidate template ignored: substitution failure [with U = int
]
auto g(U x) -> decltype(f(x)){}
     ^
1 error generated.

Гораздо проще понять, чем ошибка, вызванная g ++

1 голос
/ 23 января 2011

Скорее всего, вы используете "расширенные правила SFINAE" в C ++ 0x; так как вызов f(x) не работает в экземпляре типа возврата g (из-за невозможности вывести T для вызова f), g имеет недопустимый тип возврата и, таким образом, удаляется из набора перегрузки бесшумно. Это особенность, несмотря на то, что она наносит ущерб качеству сообщений об ошибках, поскольку компилятор предполагает, что g - это не связанная функция, которую вы не собираетесь вызывать. В этом случае нет других перегрузок g, поэтому компилятор должен выдавать более качественное сообщение.

Более подробную информацию о расширенном SFINAE можно получить по адресу http://www.open -std.org / jtc1 / sc22 / wg21 / docs /apers / 2008 / n2634.html .

...