我想做这样的事:
int displayAll(Message *m, string &lastIndex, int &NumPrinted = 0 );它给我带来了错误,把int转换成int&。
我也试过这个:
int temp =0;
int displayAll(Message *m, string &lastIndex, int &NumPrinted = temp );尽管如此,它还是会产生以下错误:
error: ISO C++ forbids in-class initialization of non-const static member 'temp'即使static int temp; 也会出错。
错误: ISO C++禁止非const静态成员“temp”的类内初始化。
发布于 2012-02-09 05:49:07
您提到的第一行代码的问题是,您正在尝试传递对临时变量的引用。
class Foo {
int displayAll(Message *m, bool &moreElements, string &lastIndex, int &NumPrinted = 0 );
};第二段代码抱怨是因为您试图静态地初始化一个类成员。
class Foo {
int temp =0;
int displayAll(Message *m, bool &moreElements, string &lastIndex, int &NumPrinted = temp );
};(我正在将您的代码放入类声明中,以清楚所发生的事情)。
一个不引入静态变量的解决问题的简单方法是显式函数重载:
class Foo {
inline int displayAll(Message *m, bool &moreElements, string &lastIndex) {
int dummy = 0;
return displayAll(m, moreElements, lastIndex, dummy);
}
int displayAll(Message *m, bool &moreElements, string &lastIndex, int &NumPrinted);
};有一些样板,但它实现了你想要的。希望这能有所帮助。
编辑:更多的澄清。问题的核心是函数必须引用它可以修改的内存这一事实。如果您传递它为一个临时变量(在术语的C++意义上是临时的,而不仅仅是英语语言术语)(就像在您的第一行代码中那样),它是非法的C++,因为在使用它作为函数的参数之前,通常会将一个临时变量复制到一个值:
void bar( int someNum = 0 ); // think of this as creating a temporary rvalue 0
// and then copying it into the function for use.
// temporary rvalues arise in expressions like
int v = 5 + 5; // the result of 5 + 5 is stored in a temporary rvalue, and then
// copied into v (which is an lvalue in this case).所以我们需要一个"lvalue",或者某个全局变量,或者一个临时局部变量(在英语意义上),就像我在我的答案中所给出的那样。我正要使用静态变量编写一个解决方案,但存在一个很大的缺陷--因为静态变量将由类的所有实例共享,所以它将从0开始,然后在每次调用该方法时都会有所不同(因为之前的调用会对它进行修改)。更糟糕的是,在多个线程的情况下,您将从多个处理器读取/写入相同的内存位置,因此该值将是完全的垃圾,并且当每次写入将使每个其他内核的缓存失效时,您就会对处理器内核的缓存产生不良影响。太丑了,请别这么做。:P
通过使用我的第一个解决方案,您可以使临时变量非常本地,而不会对其他任何东西产生太大影响。
发布于 2012-02-09 05:40:19
除非您将temp声明为static:请参阅this堆栈溢出帖子,否则不能对非const引用执行此操作。
发布于 2012-02-09 07:09:07
我也想出了一种有趣的方法来实现这个目标:
class demo {
public:
void displayAll(int &x, int y = 0 ) {
int *p;
if(y)
p = (int*)y;
if(p) *p = 10;
x = 4;
}
};
int main() {
int x=0, y=0;
demo *obj = new demo();
obj->displayAll((x);
//obj->temp(x,(int)&y);
cout << "\n x= " << x << " y " << y;
return 0;
}https://stackoverflow.com/questions/9205893
复制相似问题