GCC 中非命名空间范围内显式专用化的解决方法

Workaround for explicit specialization in non-namespace scope in GCC

提问人:Bert 提问时间:11/15/2023 最后编辑:Bert 更新时间:11/20/2023 访问量:64

问:

我遇到了与此处发布的相同的问题,因为非命名空间范围内的显式专业化无法在 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 中,在这种情况下调用非专用方法。

C++ GCC

评论

0赞 Weijun Zhou 11/15/2023
你不能改成吗?std::is_same_v<int, T>A==Axis::X
1赞 Sam Varshavchik 11/15/2023
你能展示真实的代码,一个真实的例子,你试图编译而不是假代码吗?特别忽略这里提出的问题,是任何有自尊心的 C++ 编译器都不会接受的。我尝试测试了一些东西,但很快就遇到了不相关的编译错误,这简直是在浪费我的时间,于是我放弃了。template <Axis A> T GetValue() const
0赞 Bert 11/15/2023
扩展了代码。
0赞 Bert 11/15/2023
如果我将其更改为下面的代码,它将不起作用。调用泛型方法而不是专用方法:template <Axis A, std::enable_if_t<A == Axis::X>> T GetValue() const
0赞 Weijun Zhou 11/15/2023
这不是我的意思。我的意思是.但是现在我注意到您使用的是函数模板而不是类模板,并且函数模板不能部分专用化,因此这不起作用。确实,我很惊讶您的版本甚至可以编译。template <Axis A>T GetValue<A, std::enable_if_t<A==Axis::X>>template <Axis A, std::enable_if_t<A==Axis::X>>

答: 暂无答案