【问题标题】:Nested type binding in concept fails on GCC and clang but not msvc概念中的嵌套类型绑定在 GCC 和 clang 上失败,但在 msvc 上失败
【发布时间】:2021-09-22 13:49:09
【问题描述】:

这段代码:

template<typename T, template<typename> typename Pred>
concept sats_pred = static_cast<bool>(Pred<T>::value);

template<template<typename...> typename A, template<typename> typename Cond>
struct is_container_of_helper {
    template<sats_pred<Cond>... Ts>
    void operator()(const A<Ts...>&) const
    {}
};

template<typename T>
struct always_true {
    static constexpr bool value = true;
};


template<typename T, template<typename...> typename Container, template<typename> typename Cond>
concept is_container_of_if = requires(const T& v, const is_container_of_helper<Container, Cond>& h)
{
    h(v);
};

template<typename T, template<typename...> typename A>
concept is = is_container_of_if<T, A, always_true>;

template<template<typename...> typename A>
struct is_a {
    template<typename T>
    struct type {
        static constexpr bool value = is<T, A>;
    };
};


template<typename T, template<typename...> typename Contained, template<typename...> typename Container>
concept is_container_of = is_container_of_if<T, Container, typename is_a<Contained>::type>;

不在 gcc 或 clang trunk 下编译,但在 msvc (godbolt) 下编译。在 gcc/clang 下它给出了

expected a class template, got 'typename is_a<Contained>::type

此代码有效吗?如果没有,有没有办法用有效的代码实现同样的事情,为什么 msvc 会编译它?

【问题讨论】:

    标签: c++ templates gcc visual-c++


    【解决方案1】:

    像这样更改代码的最后一部分:

    template<typename T, template<typename...> typename Contained, template<typename...> typename Container>
    concept is_container_of = is_container_of_if<T, Container, is_a<Contained>::template type>;
    

    它在 clang 和 gcc 中编译。 is_container_of_if 需要一个 template 作为最后一个模板参数,但您试图传递一个类型。

    【讨论】:

    • 对,这是有道理的。真的希望错误消息能更有助于说明这一点:p
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多