gpt4 book ai didi

c++ - Variadic 函数和 C++11,将对象作为参数传递

转载 作者:行者123 更新时间:2023-11-30 01:52:06 25 4
gpt4 key购买 nike

我有这样的麻烦,当我们开始使用新的 C++11 时,编译器 (GCC) 说这段代码是错误的,但它在旧版本上工作正常:(

std::list<CCPoint> createPointArray(int count, ...) {
CCPoint val;
std::list<CCPoint*> arr;

va_list vl;
va_start(vl,count);
for (int i=0;i<count;i++)
{
val = va_arg(vl,CCPoint*);
arr.push_back(*val);
}
va_end(vl);

return arr;
}

这就是我正在使用的方式:

createPointArray(3, &CCPoint(1.3,2.7), &CCPoint(1.5,1.75), &CCPoint(1.9,1.3))

编译器接下来告诉我:

Error   486 error : taking address of temporary [-fpermissive] (col 57) 

为什么 &CCPoint(1.3,2.7) 有问题?我如何更改此代码以适用于 C++11 和旧版本?

附注:我使用的是 Marmalade 7.3.1、Visual Studio 2010、cocos2d-x v2.2.1

最佳答案

如果您使用的是 C++11,请不要首先编写此函数。新的初始化列表构造函数将为您处理:

std::list<CCPoint> l { CCPoint(1.3,2.7), CCPoint(1.5, 1.75), CCPoint(1.9, 1.3) };

如果出于某种原因你想继续使用这个可变参数函数,你可以通过不获取临时地址来阻止编译器提示你获取了临时地址。

你可以按值传递对象,尽管正如 ecatmur 指出的那样这是实现定义的(如果复制和移动构造函数和析构函数都是微不足道的,那应该没问题):

std::list<CCPoint> m = createPointArray(3, CCPoint(1.3,2.7),
CCPoint(1.5,1.75), CCPoint(1.9,1.3));

(您已经在函数中将 val 声明为 CCPoint 实例 - 而不是指针。只需更改 va_arg 类型以匹配)。

否则,您可以直接传递 double 值:

std::list<CCPoint> m = createPointArray(3, 1.3, 2.7, 1.5, 1.75, 1.9, 1.3);

std::list<CCPoint> createPointArray(int count, ...) {
std::list<CCPoint> arr;

va_list vl;
va_start(vl,count);
for (int i=0;i<count;i++) {
double x = va_arg(vl,double);
double y = va_arg(vl,double);
arr.push_back(CCPoint(x,y));
}
va_end(vl);

return arr;
}

关于c++ - Variadic 函数和 C++11,将对象作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25139035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com