SFINAE与VS2013的编译器错误,但在VS2010中没有

时间:2014-03-19 15:08:17

标签: templates c++11 visual-studio-2013 sfinae

    #include "stdafx.h"
    #include <tuple>
    #include <functional>
    #include <boost/utility/declval.hpp>

    class cBuffer
    {};

    template<typename T>
    class cBufferT : public cBuffer
    {};

    template <typename T, typename FUNC>
    struct cCallbackChecker
    {
        struct HasNoParam
        {
            template <typename U>
            static auto test(U *x, FUNC i_callback) -> decltype((x->*i_callback)(), char());

            template <typename U>
            static auto test(...) -> int;

            enum
            {
                value = sizeof(test<T>(0, 0)) == 1
            };
        };
        struct HasParam
        {
            template <typename U>
            static auto test(U *x, FUNC i_callback) -> decltype((x->*i_callback)(std::declval<cBuffer *>()), char());

            template <typename U>
            static auto test(...) -> int;

            enum
            {
                value = sizeof(test<T>(0, 0)) == 1
            };
        };
    };

template<typename FUNC, typename STATION>
void bindCallback(STATION *i_station, typename std::enable_if<cCallbackChecker<STATION, FUNC>::HasNoParam::value, FUNC>::type i_callback)
{
}
template<typename FUNC, typename STATION>
void bindCallback(STATION *i_station, typename std::enable_if<cCallbackChecker<STATION, FUNC>::HasParam::value, FUNC>::type i_callback)
{
}
template<typename FUNC, typename STATION>
void test(STATION *i_station, FUNC i_callback)
{
    bindCallback<FUNC, STATION>(i_station, i_callback);
}

struct Test
{
//  void f(cBuffer *); //works
    void f(cBufferT<int> *); // not works
    {}
};
struct Test2
{
    void f()
    {}
};


int main(int argc, char* argv[])
{
    auto b = boost::declval<int>();
    Test t;
    test(&t, &Test::f);
    Test2 t2;
    test(&t2, &Test2::f);
}

此代码不能使用VS2013编译,而是使用VS2010编译。

VS2013问题:

  

C2770: invalid explicit template argument(s) for 'void bindCallback.

那么,是否有人知道为什么会出现这种错误以及在这种情况下该怎么做。我想检查一个成员函数是否确实存在给定的签​​名。

我现在可以使用no参数案例。但现在我还想支持cBuffer *类型的单个参数。在VS2010中,此代码有效。在VS2013中没有。

0 个答案:

没有答案