Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates SFINAE与VS2013但不在VS2010中出现编译器错误 #包括“stdafx.h” #包括 #包括 #包括 cBuffer类 {}; 模板 cBufferT类:公共cBuffer {}; 模板 结构cCallbackChecker { 结构HasNoParam { 模板 静态自动测试(U*x,FUNC i_回调)->decltype((x->*i_回调)(),char()); 模板 静态自动测试(…)->int; 枚举 { 值=sizeof(测试(0,0))==1 }; }; 结构HasParam { 模板 静态自动测试(U*x,FUNC i_回调)->decltype((x->*i_回调)(std::declval()),char()); 模板 静态自动测试(…)->int; 枚举 { 值=sizeof(测试(0,0))==1 }; }; }; 模板 void bindCallback(STATION*i_STATION,typename std::enable_if::type i_callback) { } 模板 void bindCallback(STATION*i_STATION,typename std::enable_if::type i_callback) { } 模板 无效测试(站点*i_站点,函数i_回调) { bindCallback(i_站,i_回调); } 结构测试 { //void f(cBuffer*);//有效 void f(cBufferT*);//不起作用 {} }; 结构测试2 { void f() {} }; int main(int argc,char*argv[]) { 自动b=boost::declval(); 试验t; 测试(&t,&t::f); test2t2; 测试(&t2,&Test2::f); }_Templates_C++11_Visual Studio 2013_Sfinae - Fatal编程技术网

Templates SFINAE与VS2013但不在VS2010中出现编译器错误 #包括“stdafx.h” #包括 #包括 #包括 cBuffer类 {}; 模板 cBufferT类:公共cBuffer {}; 模板 结构cCallbackChecker { 结构HasNoParam { 模板 静态自动测试(U*x,FUNC i_回调)->decltype((x->*i_回调)(),char()); 模板 静态自动测试(…)->int; 枚举 { 值=sizeof(测试(0,0))==1 }; }; 结构HasParam { 模板 静态自动测试(U*x,FUNC i_回调)->decltype((x->*i_回调)(std::declval()),char()); 模板 静态自动测试(…)->int; 枚举 { 值=sizeof(测试(0,0))==1 }; }; }; 模板 void bindCallback(STATION*i_STATION,typename std::enable_if::type i_callback) { } 模板 void bindCallback(STATION*i_STATION,typename std::enable_if::type i_callback) { } 模板 无效测试(站点*i_站点,函数i_回调) { bindCallback(i_站,i_回调); } 结构测试 { //void f(cBuffer*);//有效 void f(cBufferT*);//不起作用 {} }; 结构测试2 { void f() {} }; int main(int argc,char*argv[]) { 自动b=boost::declval(); 试验t; 测试(&t,&t::f); test2t2; 测试(&t2,&Test2::f); }

Templates SFINAE与VS2013但不在VS2010中出现编译器错误 #包括“stdafx.h” #包括 #包括 #包括 cBuffer类 {}; 模板 cBufferT类:公共cBuffer {}; 模板 结构cCallbackChecker { 结构HasNoParam { 模板 静态自动测试(U*x,FUNC i_回调)->decltype((x->*i_回调)(),char()); 模板 静态自动测试(…)->int; 枚举 { 值=sizeof(测试(0,0))==1 }; }; 结构HasParam { 模板 静态自动测试(U*x,FUNC i_回调)->decltype((x->*i_回调)(std::declval()),char()); 模板 静态自动测试(…)->int; 枚举 { 值=sizeof(测试(0,0))==1 }; }; }; 模板 void bindCallback(STATION*i_STATION,typename std::enable_if::type i_callback) { } 模板 void bindCallback(STATION*i_STATION,typename std::enable_if::type i_callback) { } 模板 无效测试(站点*i_站点,函数i_回调) { bindCallback(i_站,i_回调); } 结构测试 { //void f(cBuffer*);//有效 void f(cBufferT*);//不起作用 {} }; 结构测试2 { void f() {} }; int main(int argc,char*argv[]) { 自动b=boost::declval(); 试验t; 测试(&t,&t::f); test2t2; 测试(&t2,&Test2::f); },templates,c++11,visual-studio-2013,sfinae,Templates,C++11,Visual Studio 2013,Sfinae,此代码不使用VS2013编译,而是在VS2010中编译 VS2013问题: C2770:void bindCallback的显式模板参数无效。 那么,有没有人知道为什么会发生这种错误,以及在这种情况下该怎么办。我想检查具有给定签名的成员函数是否存在 我现在让它在并没有参数的情况下工作。但现在我还想支持类型为cBuffer*的单个参数。在VS2010中,此代码有效。在VS2013中,情况并非如此 你需要问一个问题,否则你的帖子可能会被关闭。无关:两个HasNoParam::test的重载都返回in

此代码不使用VS2013编译,而是在VS2010中编译

VS2013问题:

C2770:void bindCallback的显式模板参数无效。

那么,有没有人知道为什么会发生这种错误,以及在这种情况下该怎么办。我想检查具有给定签名的成员函数是否存在


我现在让它在并没有参数的情况下工作。但现在我还想支持类型为
cBuffer*
的单个参数。在VS2010中,此代码有效。在VS2013中,情况并非如此

你需要问一个问题,否则你的帖子可能会被关闭。无关:两个
HasNoParam::test
的重载都返回
int
,因此
value
只有在
int
char
大小相同的平台上才会是
true
。我假设您的意思是让一个重载返回
char
——在这种情况下,在
int
char
大小相同的平台上,它们将无法区分;)微软称此失败为实现C++“缺少表达式SFIEAE支持”。
    #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);
}