"没有函数模板的实例匹配参数列表":编译器将指针作为size_t传递,将size_t作为int传递.



我有这个概念和模板函数

template<typename T>
concept Averageable = std::is_default_constructible<T>::value &&
requires(T a, T b)
{
{ a += b } -> std::convertible_to<T>;
{a / size_t(1)} -> std::convertible_to<T>;
};
template<typename T> 
requires Averageable<T>
T mean(const T* vals, size_t size) 
{
T sum();
for (size_t i{}; i < size; size++)
{
sum += vals[i];
}
return sum / size;
}

由于某些原因,像这样调用

const int a[]{1,2,3};
const int res = mean<int>(a, 3);

导致以下智能感知错误

no instance of function template matches the argument list            argument types are: (size_t, int)

我使用Visual Studio 2022与c++ 20。我试着寻找为什么这种情况不断发生的原因(以及一个适当的概念教程),但没有找到。

我是使用概念/要求的新手,所以如果有人有任何见解,为什么这不起作用或如何正确地做到这一点,我将非常感激

你的概念/要求很好。你在这里遇到的问题实际上是最令人烦恼的解析。也就是这一行:

T sum();

尽管它看起来像是在构造一个整数,但它实际上声明了一个返回T的函数。

要解决这个问题,只需将括号改为大括号:
T sum{};

旁注,在for循环中,您可能想要i++而不是size++

相关内容

最新更新