Проблема с первой строки кода вы упоминаете, что вы пытаетесь передать ссылку на временную переменную
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);
};
Там есть немного шаблонный, но добивается того, чего вы хотите. Надеюсь, это поможет.
EDIT: Дополнительные разъяснения. Ядро проблемы связано с тем, что функция должна ссылаться на некоторую память, которую она может изменять. Если вы передадите ему временную переменную (временную, как в значении термина 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).
так что нужно то, что является «именующим», либо каким-то глобальным переменным где-либо временным локальным переменным (в английском смысле языка), как я дал в мой ответ. Я собирался написать решение, используя статическую переменную, но есть большая ошибка - поскольку статическая переменная будет использоваться всеми экземплярами вашего класса, она начнет 0, а затем будет различной при каждом вызове метода (поскольку это было бы отредактировано предыдущим вызовом). Хуже того, в случае нескольких потоков вы будете читать/записывать в одно и то же место памяти из нескольких процессоров, поэтому значение будет полным мусором, и вы плохо изнасируете кеши процессоров, поскольку каждая запись приведет к недействительности кеша каждого другого ядра. Это уродливо, пожалуйста, не делай этого. : P
Используя мое первое решение, вы делаете временную переменную очень локальной, без особого влияния на что-либо еще.
Что такое 'displayPagePrinted'? Вы не показываете правильную часть кода, как кажется. В любом из аргументов функции, которые вы показали, нет 'displayPagePrinted'. –
Сообщение об ошибке явно не имеет ничего общего с передачей аргументов: похоже, это связано со статическим членом в вашем классе, который вы инициализируете значением без использования C++ 2011. –
Opps! Я исправил ошибку, которую я получаю. –