嵌套的decltype与msvc导致错误

时间:2015-12-13 01:36:31

标签: c++ templates c++11 visual-c++ function-pointers

我正在尝试创建一个将成员函数作为constexpr静态成员的类。事情在GCC和Clang上都很有效,但在MSVC 2015上,事情变得更加复杂。

这里是一个重现错误的代码:

template<typename T, T t>
struct Method {
    using Type = T;
    constexpr const static T method = t;
};

template<typename T, T t>
constexpr const T Method<T, t>::method;

struct Test1 {
    void method1(int, double) {}
};

struct Test2 {
    template<typename T, T t, typename... Params>
    void method2(Params...) {}

    template<typename T, T t>
    void method3(int, double) {}

    //using p1_t = Method<
    //  decltype(&Test2::method2<decltype(&Test1::method1), &Test1::method1, int, double>),
    //  &Test2::method2<decltype(&Test1::method1), &Test1::method1, int, double>
    //>;
};

int main()
{
    Method<
        void (Test2::*)(int, double),
        &Test2::method2<decltype(&Test1::method1), &Test1::method1, int, double>
    > p1;

    //Method<
    //  decltype(&Test2::method2<decltype(&Test1::method1), &Test1::method1, int, double>),
    //  &Test2::method2<decltype(&Test1::method1), &Test1::method1, int, double>
    //> p2;

    Method<
        void (Test2::*)(int, double),
        &Test2::method3<decltype(&Test1::method1), &Test1::method1>
    > p3;

    //Method<
    //  decltype(&Test2::method3<decltype(&Test1::method1), &Test1::method1>),
    //  &Test2::method3<decltype(&Test1::method1), &Test1::method1>
    //> p4;

    return 0;
}

取消注释p2p4的声明会导致MSVC 2015出错。

但是在海湾合作委员会,一切都没问题,live on coliru

是否有可能在MSVC上做这样的事情以及解决方法是什么?

0 个答案:

没有答案