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); }
此代码不使用VS2013编译,而是在VS2010中编译 VS2013问题: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
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);
}