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

ADL 无法找到友元函数 GCC 10.2.0

如何解决ADL 无法找到友元函数 GCC 10.2.0

我遇到了 ADL 无法找到隐藏朋友的问题。我正在开发一个 c++20 代码库,该代码库可以在最新版本的 msvc 上运行,但是我将它移回了一点,并让它在 arch linux 上使用 gcc 10.2.0 进行编译。有一些孤立的地方抱怨这些隐藏的朋友超出了范围,所以看起来确实有一些我缺少的编译器标志而不是代码中的错误,特别是因为它确实在 MSVC 和 C++ 上编译gcc 的兼容性图表似乎没有缺少任何必需的功能

我已将以下内容添加到 cmake 中,以尝试确保禁用 GNU 扩展并启用 c++20 标准。

set_target_properties(ttauri PROPERTIES
    CXX_STANDARD 20
    CXX_STANDARD_required ON
    CXX_EXTENSIONS OFF
)

这是其中一个函数的示例。

    constexpr static ssize_t get_zero = -1;
    constexpr static ssize_t get_one = -2;

    template<ssize_t I>
    [[nodiscard]] friend constexpr T &get(numeric_array &rhs) noexcept
    {
        static_assert(I >= 0 && I < N,"Index out of bounds");
        return get<I>(rhs.v); // v is a different class so its not the numeric_array get function
    }

    template<ssize_t I>
    [[nodiscard]] friend constexpr T get(numeric_array &&rhs) noexcept
    {
        static_assert(I >= -2 && I < N,"Index out of bounds");
        if constexpr (I == get_zero) {
            return T{0};
        } else if constexpr (I == get_one) {
            return T{1};
        } else {
            return get<I>(rhs.v); // v is a different class so its not the numeric_array get function
        }
    }

    template<ssize_t I>
    [[nodiscard]] friend constexpr T get(numeric_array const &rhs) noexcept
    {
        static_assert(I >= -2 && I < N,"Index out of bounds");
        if constexpr (I == get_zero) {
            return T{0};
        } else if constexpr (I == get_one) {
            return T{1};
        } else {
            return get<I>(rhs.v); // v is a different class so its not the numeric_array get function
        }
    }

这里它稍后在同一个类中使用。

    template<ssize_t I,ssize_t FirstElement,ssize_t... RestElements>
    constexpr void swizzle_detail(numeric_array &r) const noexcept
    {
        static_assert(I < N);
        static_assert(FirstElement >= -2 && FirstElement < N,"Index out of bounds");

        get<I>(r) = get<FirstElement>(*this); // Error on this line
        if constexpr (sizeof...(RestElements) != 0) {
            swizzle_detail<I + 1,RestElements...>(r);
        }
    }

我认为我要问的与其他帖子不同 (Hidden friend template function not found by ADL) 因为我的返回类型是类模板而不是函数模板。

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