gpt4 book ai didi

c++ - Clang "couldn' t 推断模板参数“而 gcc/g++ 可以。哪个是正确的?

转载 作者:IT老高 更新时间:2023-10-28 21:48:11 26 4
gpt4 key购买 nike

我一直在尝试用 clang 编译一个项目(使用 gcc/g++ 很好),并且编译停留在模板调用上。 我尝试创建显示相同错误消息的最简单的类似代码。这里是:

#include <vector>
#include <utility>
#include <iostream>

using namespace std;

int A( double in )
{
return 1;
}

int A( int in )
{
return 1;
}


template<class M, class T>
M test(T input, M (fun) (T) )
{
return fun( input );
}



int main( int argc, const char *argv[] )
{
cout << test( (int) 1, A ) << test( (double) 1.2, A ) << endl;
return 0;
}

来自clang的错误(当然出现两次):

error: no matching function for call to 'test'
candidate template ignored: couldn't infer template argument 'M'

Gcc 没有提示。请注意 M 是返回类型并且总是“int”。

有人知道哪个是正确的,为什么?

谢谢

最佳答案

g++ 是错误的。来自 C++11 [temp.deduct.type]p5:

The non-deduced contexts are: [...] - A function parameter for which argument deduction cannot be done because the associated function argument is [...] a set of overloaded functions, and [...] more than one function matches the function parameter type

这个决定是在不考虑模板参数的情况下做出的,模板参数可能已经在别处推导出来了,所以 T 必须推导出为 int 的事实与这里无关。这使得整个参数 M (fun)(T) 成为非推导上下文。因此,正如 Clang 所声称的那样,无法推断出 M

在确定第二个参数是否为非推导上下文时,

g++ 似乎错误地使用了第一个函数参数的 'T = int' 推导。颠倒函数参数的顺序也会导致 g++ 拒绝代码:

int A(double);
int A(int);
template<class M, class T>
M test(M (fun) (T), T input) {
return fun( input );
}
int main( int argc, const char *argv[]) {
test(A, 1);
test(A, 1.2);
}

关于c++ - Clang "couldn' t 推断模板参数“而 gcc/g++ 可以。哪个是正确的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17807124/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com