![](/img/trans.png)
[英]How to make variadic template class method take function pointer as argument with type derived from function template?
[英]recursive variadic template function call “loses” pointer on second argument type
我有一个使用可变参数模板的函数(GetArg s )来对参数(每个指针)进行排序,然后将每个函数发送到已为每种类型重载的另一个函数(GetArg)(目前为int和float)。 然后,每种类型的重载功能都会在指针处设置值。
它可以很好地编译,并且当我使用单个类型的许多参数调用函数时,它运行良好。 但是,如果我使用两种类型(float和int),它将运行良好,直到第二种类型的第一次出现,因为(从我所知道的)指针地址为空(调试器中为0x0)而崩溃。
这是我的函数定义(在main中包含的命名空间中声明):
namespace.h
int GetArg(int iStackPos,int *i);
int GetArg(int iStackPos,float *f);
template<typename tFirst> int GetArgs(tFirst first)
{
GetArg(-1,first);
}
template<typename tFirst, typename... tRest> int GetArgs(tFirst first, tRest... rest)
{
int iStackPos = ((sizeof...(rest) + 1) * -1);
GetArg(iStackPos,first);
GetArgs((rest)...);
return 0;
}
namespace.cpp
int GetArg(int iStackPos,int *i)
{
*i = 1;
}
int GetArg(int iStackPos,float *f)
{
*f = 2.5;
}
调用以获取main中的args:
会运行良好:
int *i1;
float *f1;
namespace::GetArgs(f1,f1,f1,f1); //no use of int
会崩溃:
int *i1;
float *f1;
namespace::GetArgs(f1,i1,f1); //use of int
当int优先出现而后跟float时,情况也是如此。 空指针发生在递归GetArgs()调用中,并且发生崩溃是因为重载的int GetArg()试图写入该指针。 iStackPos用作lua堆栈上的位置,因为这意味着它是从lua获取参数的包装器。 但是我只用赋了int 1 float 2.5代替了lua代码,因为lua代码不是问题。
正如其他人已经建议的那样,您正在将未初始化的内存传递给函数。 这会产生不确定的行为。
另外,您不会在GetArg
函数和第一个GetArgs
返回任何内容。 这也会给您带来麻烦。
以及在计算iStackPos时结合使用size_t和int。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.