为什么在约束中找到模板而不是函数?C + + 20

  • 本文关键字:函数 约束 c++ c++20 c++-concepts
  • 更新时间 :
  • 英文 :


我正在学习c++ 20的概念和约束,我不明白为什么在这种情况下T被认为是未定义的,但它似乎在requires子句中工作得很好。这是怎么了?,为什么?

如果我去掉分号,编译器说U is not a template

error: expected unqualified-id before ‘;’ token
11 | requires std::integral<T> || std::floating_point<T>;
|                                                    ^
main.cpp:12:28: error: ‘T’ was not declared in this scope
12 | constexpr double average(U<T> const &it) {
#include <numeric>
#include <vector>
#include <iostream>
#include <concepts>
template <typename T, std::forward_iterator U>
requires std::integral<T> || std::floating_point<T>;
constexpr double average(U<T> const &it) {
const double sum = std::accumulate(it.begin(), it.end(), 0.0);
return sum / it.size();
}
int main() {
std::vector ints { 1, 2, 3, 4, 5};
std::cout << average(ints) << 'n';
}

请阅读有关容器概念的完整解决方案。这里有一个部分的解决方案,只是为了说明一个方向。

#include <numeric>
#include <vector>
#include <iostream>
#include <concepts>
template <typename T>
requires requires (std::integral<typename T::value_type>) || (std::floating_point<typename T::value_type>)
constexpr double average(T const &container) {
const double sum = std::accumulate(container.begin(), container.end(), 0.0);
return sum / container.size();
}
int main() {
std::vector ints { 1, 2, 3, 4, 5};
std::cout << average(ints) << 'n';
}

最新更新