递归可变参数模板函数调用"失去"第二个参数类型的指针

时间:2016-01-28 10:37:52

标签: c++ pointers recursion overloading variadic-templates

我使用可变参数模板获取了一个函数(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首先出现并且之后浮动时也是如此。 空指针发生在递归GetArgs()调用中,并且发生崩溃是因为重载的int GetArg()尝试写入该指针。 iStackPos用作lua堆栈上的位置,因为这是一个从lua获取参数的包装器。但是,我只是通过分配int 1 ,float 2.5 来替换lua代码,因为lua代码不是问题。

1 个答案:

答案 0 :(得分:0)

正如其他人已经建议的那样,您将未初始化的内存传递给您的函数。这会产生不确定的行为。

此外,您未在GetArg函数和第一个GetArgs中返回任何内容。这也会让你陷入麻烦。

在计算iStackPos时你将size_t和int结合起来。