【问题标题】:Constraints not satisfied for template template concept requiring static template method需要静态模板方法的模板模板概念不满足约束
【发布时间】:2018-05-19 23:59:58
【问题描述】:

我正在尝试使用 C++ 概念实现 Functor 和其他各种类别理论概念,但出现编译错误:

http://coliru.stacked-crooked.com/a/e8b6eb387229bddf

这是我的完整代码(我知道要求 fmap<int, int> 不会验证任何两种类型的 fmap,我计划将其更改为 fmap<int, std::string> 或其他东西以实现稍强的测试——或者相反,可能更改Functor 概念,使其除了F 之外,还包含TU 两种类型,并验证fmap<T, U> 的存在,但这就是在我弄清楚如何修复我的错误之后米得到):

#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&lt;F&gt;,则代码编译并运行。

【问题讨论】:

    标签: c++ templates c++-concepts template-templates


    【解决方案1】:

    问题正是错误消息所说的:Functor_Impl&lt;F&gt;::template fmap&lt;int, int&gt;(x) 不是有效的表达式。 Functor_Impl&lt;std::vector&gt;::fmap 有两个参数,不是一个。

    【讨论】:

    • 老天,我可能会删除这个问题:/
    猜你喜欢
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 2022-09-29
    • 2021-09-21
    • 1970-01-01
    相关资源
    最近更新 更多