提问人:Bert 提问时间:11/15/2023 最后编辑:Bert 更新时间:11/20/2023 访问量:64
GCC 中非命名空间范围内显式专用化的解决方法
Workaround for explicit specialization in non-namespace scope in GCC
问:
我遇到了与此处发布的相同的问题,因为非命名空间范围内的显式专业化无法在 GCC 中编译。为此,在 GCC (85282) 上报告了一个错误,并列出了一种解决方法:
如果你想要这个:
struct A {
template<class T>
struct B;
template<>
struct B<int> { }; // unsupported class-scope explicit specialization
};
对 C++17 执行此操作:
struct A {
template<class T, class = void>
struct B;
template<class T>
struct B<T, std::enable_if_t<std::is_same_v<int, T>>> { };
};
就我而言,我的模板参数不是一个类型,而是一个:enum
enum class Axis
{
X = 0,
Y = 1,
Z = 2
};
template <typename T>
class Triplet
{
T _x;
T _y;
T _z;
public:
Triplet(): _x(), _y(), _z()
{
}
T GetX() const
{
return _x;
}
// Getters for Y and Z omitted
template <Axis A>
T GetValue() const
{
return 0; // Not supported!
}
template <>
T GetValue<Axis::X>() const
{
return GetX();
}
// Getters for Y and Z omitted
}
该代码在 Visual Studio (2019) 中有效,但在 GCC 上失败。
有人可以帮我解决我的情况吗?代码需要在 Visual Studio 2019 和 GCC 上运行。
编辑: 评论者的以下建议不起作用:
template <Axis A, std::enable_if_t<A == Axis::X>>
T GetValue() const
{
return GetX();
}
在 Visual Studio 2019 中,在这种情况下调用非专用方法。
答: 暂无答案
评论
std::is_same_v<int, T>
A==Axis::X
template <Axis A> T GetValue() const
template <Axis A, std::enable_if_t<A == Axis::X>> T GetValue() const
template <Axis A>T GetValue<A, std::enable_if_t<A==Axis::X>>
template <Axis A, std::enable_if_t<A==Axis::X>>