2012-02-09 2 views
1

Я хочу сделать что-то вроде этого:Присвоение значений по умолчанию для аргументов, передаваемых по ссылке

int displayAll(Message *m, string &lastIndex, int &NumPrinted = 0); 

Это дает мне ошибку, списывание о междунар в целом &.

Я попытался это тоже:

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++ запрещает в классе инициализации неконстантного статического члена «Темп»

+1

Что такое 'displayPagePrinted'? Вы не показываете правильную часть кода, как кажется. В любом из аргументов функции, которые вы показали, нет 'displayPagePrinted'. –

+0

Сообщение об ошибке явно не имеет ничего общего с передачей аргументов: похоже, это связано со статическим членом в вашем классе, который вы инициализируете значением без использования C++ 2011. –

+0

Opps! Я исправил ошибку, которую я получаю. –

ответ

1

Проблема с первой строки кода вы упоминаете, что вы пытаетесь передать ссылку на временную переменную

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

Используя мое первое решение, вы делаете временную переменную очень локальной, без особого влияния на что-либо еще.

+0

большое спасибо! действительно это значит. Но есть ли другой вариант? –

+0

добавлено разъяснений :) –

0

Вы не можете сделать это для неконстантного ссылки, если вы не объявить временный быть static: см this StackOverflow после.

+0

Не обязательно быть «статическим», просто не нужно быть временным. Только ссылки 'const' могут быть привязаны к временному. Поэтому либо создайте ссылку 'const', либо привяжите ее к переменной, которая не является временной. –

+0

Как сделать это «не» временным? –

0

Я fpund это интересный способ достижения этой цели тоже:

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; 
} 
Смежные вопросы