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 (将#修改为@)