问题描述
我遇到了 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 (将#修改为@)