1

コンパイラのエラーメッセージがもっと役に立ったらすぐに修正できたはずのコンパイラエラーのデバッグに数時間を費やしました。

私はそれを簡単な例に減らしました:

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の定義が呼び出しに一致しないということではなく、定義が不正であるということです(decltypeの式f(x)では、指定せずに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

私はそのような何かを期待していたでしょう...

4

2 に答える 2

1

C++0xで「拡張SFINAE」ルールに違反している可能性があります。toの呼び出しf(x)は、のreturnタイプのインスタンス化内で機能していないため(への呼び出しをg推測できないため)、無効なreturnタイプを持っているため、サイレントに設定されたオーバーロードから削除されます。これは、エラーメッセージの品質に悪影響を与えるにもかかわらず、機能です。コンパイラは、これを呼び出すつもりのない無関係な関数であると想定しているためです。この場合、他のオーバーロードはないので、コンパイラはより良いメッセージを出すはずです。Tfggg

拡張SFINAEの詳細については、http: //www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2634.htmlを参照してください。

于 2011-01-23T03:58:20.667 に答える
1

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++ によって生成されるエラーよりもはるかに理解しやすい

于 2011-01-23T05:55:10.610 に答える