微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

概念中的嵌套类型绑定在 GCC 和 clang 上失败,但在 msvc 上没有

如何解决概念中的嵌套类型绑定在 GCC 和 clang 上失败,但在 msvc 上没有

代码

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 编译它?

解决方法

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

    authenticationChoice(recieved) {
      this.$store.state.gitSourceAuthenticationChoice = recieved;

      this.$store.dispatch("gitSourceAuthenticationURL").then((response) => {
        this.navigationURL = response["oauth2_redirect"];
        console.log(this.navigationURL)
       window.location.href = String(this.navigationURL);
      });
  
    },

它在 clang 和 gcc 中编译。 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>; 需要一个 模板 作为最后一个模板参数,但您试图传递一个类型。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。