Проблема с первой строкой кода, которую вы упоминаете, заключается в том, что вы пытаетесь передать ссылку на временную переменную
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
Используя мое первое решение, вы делаете временную переменную очень локальной, без какого-либо влияния на что-либо еще.