首页 > 解决方案 > 具有不完整类型模板重载的 SFINAE 在与 GCC 一起使用时不适用于 Clang

问题描述

我无法使用 Clang 编译以下代码段,而 GCC 没有问题:

template <typename T, int variant=0>
struct FooCallerWrapper;

template <typename T>
struct FooCallerWrapper<T, 0>
{
    typedef int FooCallerType;
};

template<class SERVICE_T, int variant = 0>
class FooCaller
{
    template<typename Dummy>
    struct Void { typedef void type; };

    template<typename R = void, typename Enabled = void>
    struct EnableIfHasNextVariant { };

    template<typename R>
    struct EnableIfHasNextVariant<
        R,
        typename Void<typename FooCallerWrapper<SERVICE_T, variant+1>::FooCallerType>::type>
    {
        typedef R type;
    };
};

FooCaller<int> foo;

我已经阅读了这个问题,但我不明白如何在我的情况下解决它。

我使用 Clang 3.1、8.0 和 10.0 以及 GCC 5.1 和 9.3 进行了测试。

标签: c++gccclangsfinae

解决方案


推荐阅读