无益(可能是错的?)gcc错误信息

时间:2011-01-23 03:53:33

标签: c++ templates c++11 overload-resolution

我只花了几个小时调试一个编译器错误,如果编译器的错误消息更有用,我可以立即修复它。

我把它简化为一个简单的例子:

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

我会期待类似的东西......

2 个答案:

答案 0 :(得分:1)

你最有可能在C ++ 0x中达到“扩展SFINAE”规则;由于对f(x)的调用在g的返回类型的实例化中无效(因为无法推断T调用f),{{ 1}}具有无效的返回类型,因此会以静默方式从过载集中删除。这是一个功能,尽管它对错误消息质量有害,因为编译器假设g是一个您不打算调用的无关函数。在这种情况下,没有g的其他重载,因此编译器应该提供更好的消息。

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2634.html提供了有关扩展SFINAE的更多信息。

答案 1 :(得分: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 ++

产生的错误更容易理解