我有这个概念和模板函数
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++
。