如何解决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 举报,一经查实,本站将立刻删除。