需要静态模板方法的模板模板概念不满足约束
Constraints not satisfied for template template concept requiring static template method
我正在尝试使用 C++ 概念实现 Functor
和各种其他类别理论概念,但出现编译错误:
http://coliru.stacked-crooked.com/a/e8b6eb387229bddf
这是我的完整代码(我知道要求 fmap<int, int>
不会验证任何两种类型的 fmap
,我打算将其更改为 fmap<int, std::string>
或其他一些以实现稍微更强的测试——或者相反,可能改变 Functor
概念,以便它除了 F
之外还采用两种类型 T
和 U
并验证 [=20] 的存在=],但这就是我弄清楚如何修复我遇到的错误之后的全部内容):
#include <functional>
#include <iostream>
#include <vector>
// empty Functor_Impl struct - specialize for each functor
template<template<class> class F> struct Functor_Impl {};
// std::vector Functor implementation
template<>
struct Functor_Impl<std::vector> {
template<class T, class U>
static std::vector<U> fmap(std::vector<T> x, std::function<U(T)> f) {
std::vector<U> out;
out.reserve(x.size());
for (int i = 0; i < x.size(); i++) {
out.push_back(f(x[i]));
}
return out;
}
};
// Functor concept requires Functor_Impl<F> to have fmap
template<template<class> class F>
concept bool Functor = requires(F<int> x) {
{Functor_Impl<F>::template fmap<int, int>(x)} -> F<int>;
};
// Test function using constraint.
template<template<class> class F, class T>
requires Functor<F>
F<T> mult_by_2(F<T> a) {
return Functor_Impl<F>::template fmap<T, T>(a, [](T x) {
return x * 2;
});
}
int main() {
std::vector<int> x = {1, 2, 3};
std::vector<int> x2 = mult_by_2(x);
for (int i = 0; i < x2.size(); i++) {
std::cout << x2[i] << std::endl;
}
}
编译错误:
lol@foldingmachinebox:~/p/website-editor$ g++ foo.cpp -std=c++17 -fconcepts -o foo
foo.cpp: In function ‘int main()’:
foo.cpp:39:38: error: cannot call function ‘F<T> mult_by_2(F<T>) [with F = std::vector; T = int]’
std::vector<int> x2 = mult_by_2(x);
^
foo.cpp:31:6: note: constraints not satisfied
F<T> mult_by_2(F<T> a) {
^~~~~~~~~
foo.cpp:24:14: note: within ‘template<template<class> class F> concept const bool Functor<F> [with F = std::vector]’
concept bool Functor = requires(F<int> x) {
^~~~~~~
foo.cpp:24:14: note: with ‘std::vector<int> x’
foo.cpp:24:14: note: the required expression ‘Functor_Impl<F>::fmap<int, int>(x)’ would be ill-formed
我猜我对这个概念本身的语法是错误的 - 它将变量视为函数,反之亦然,因为我对 concept
语法不是很熟悉,并且在cppreference.com
上的一些示例代码在 GCC 的实现下无法编译(例如 concept EqualityComparable
无法编译,必须更改为 concept bool EqualityComparable
)。
如果我从 mult_by_2
函数声明中删除 requires Functor<F>
,则代码会编译并运行。
问题正是错误消息所说的:Functor_Impl<F>::template fmap<int, int>(x)
不是有效的表达式。 Functor_Impl<std::vector>::fmap
有两个参数,没有一个。
我正在尝试使用 C++ 概念实现 Functor
和各种其他类别理论概念,但出现编译错误:
http://coliru.stacked-crooked.com/a/e8b6eb387229bddf
这是我的完整代码(我知道要求 fmap<int, int>
不会验证任何两种类型的 fmap
,我打算将其更改为 fmap<int, std::string>
或其他一些以实现稍微更强的测试——或者相反,可能改变 Functor
概念,以便它除了 F
之外还采用两种类型 T
和 U
并验证 [=20] 的存在=],但这就是我弄清楚如何修复我遇到的错误之后的全部内容):
#include <functional>
#include <iostream>
#include <vector>
// empty Functor_Impl struct - specialize for each functor
template<template<class> class F> struct Functor_Impl {};
// std::vector Functor implementation
template<>
struct Functor_Impl<std::vector> {
template<class T, class U>
static std::vector<U> fmap(std::vector<T> x, std::function<U(T)> f) {
std::vector<U> out;
out.reserve(x.size());
for (int i = 0; i < x.size(); i++) {
out.push_back(f(x[i]));
}
return out;
}
};
// Functor concept requires Functor_Impl<F> to have fmap
template<template<class> class F>
concept bool Functor = requires(F<int> x) {
{Functor_Impl<F>::template fmap<int, int>(x)} -> F<int>;
};
// Test function using constraint.
template<template<class> class F, class T>
requires Functor<F>
F<T> mult_by_2(F<T> a) {
return Functor_Impl<F>::template fmap<T, T>(a, [](T x) {
return x * 2;
});
}
int main() {
std::vector<int> x = {1, 2, 3};
std::vector<int> x2 = mult_by_2(x);
for (int i = 0; i < x2.size(); i++) {
std::cout << x2[i] << std::endl;
}
}
编译错误:
lol@foldingmachinebox:~/p/website-editor$ g++ foo.cpp -std=c++17 -fconcepts -o foo
foo.cpp: In function ‘int main()’:
foo.cpp:39:38: error: cannot call function ‘F<T> mult_by_2(F<T>) [with F = std::vector; T = int]’
std::vector<int> x2 = mult_by_2(x);
^
foo.cpp:31:6: note: constraints not satisfied
F<T> mult_by_2(F<T> a) {
^~~~~~~~~
foo.cpp:24:14: note: within ‘template<template<class> class F> concept const bool Functor<F> [with F = std::vector]’
concept bool Functor = requires(F<int> x) {
^~~~~~~
foo.cpp:24:14: note: with ‘std::vector<int> x’
foo.cpp:24:14: note: the required expression ‘Functor_Impl<F>::fmap<int, int>(x)’ would be ill-formed
我猜我对这个概念本身的语法是错误的 - 它将变量视为函数,反之亦然,因为我对 concept
语法不是很熟悉,并且在cppreference.com
上的一些示例代码在 GCC 的实现下无法编译(例如 concept EqualityComparable
无法编译,必须更改为 concept bool EqualityComparable
)。
如果我从 mult_by_2
函数声明中删除 requires Functor<F>
,则代码会编译并运行。
问题正是错误消息所说的:Functor_Impl<F>::template fmap<int, int>(x)
不是有效的表达式。 Functor_Impl<std::vector>::fmap
有两个参数,没有一个。