Параметр функции по умолчанию С++ не работает

У меня есть функция, которой нужен параметр по умолчанию:

LINE 13:
    void genRand(double offset_x = 0.0, double offset_y = 0.0);

Это функция:

LINE 84:
    void game::genRand(double offset_x = 0.0, double offset_y = 0.0) {
        perlin.SetFrequency(0.1);
        for(int _x=0; _x<dimensions.x/32; _x++){
            for(int _y=0; _y<dimensions.y/32; _y++){
                vec.push_back((perlin.GetValue(_x+offset_x, _y+offset_y, 0.2)+1.f)*2/2);
            }
        }
    }

Ошибка:

make
g++ main.cpp -w -std=c++11 -lsfml-graphics -lsfml-window -lsfml-system -lnoise -o main
main.cpp:84:64: error: default argument given for parameter 1 of ‘void game::genRand(double, double)’ [-fpermissive]
 void game::genRand(double offset_x = 0.0, double offset_y = 0.0) {
                                                                ^
main.cpp:13:14: note: previous specification in ‘void game::genRand(double, double)’ here
         void genRand(double offset_x = 0.0, double offset_y = 0.0);
              ^
main.cpp:84:64: error: default argument given for parameter 2 of ‘void game::genRand(double, double)’ [-fpermissive]
 void game::genRand(double offset_x = 0.0, double offset_y = 0.0) {
                                                                ^
main.cpp:13:14: note: previous specification in ‘void game::genRand(double, double)’ here
         void genRand(double offset_x = 0.0, double offset_y = 0.0);
              ^

Я не понимаю, что я сделал не так.


person Martin Fischer    schedule 11.01.2015    source источник
comment
Удалите значения по умолчанию из определения функции. Они нужны только в декларации.   -  person juanchopanza    schedule 11.01.2015
comment
Вы указываете аргументы по умолчанию только в объявлении, а не в определении (если оно не встроено).   -  person πάντα ῥεῖ    schedule 11.01.2015
comment
Аргументы по умолчанию находятся только в объявлении, когда вы определяете и реализуете функцию, компилятор уже знает, каким должно быть значение (как и сама функция, вы знаете только, что получаете значение, переменная всегда там)...   -  person Zach P    schedule 11.01.2015


Ответы (1)


Когда вы пишете определение функции (тела) отдельно, то больше default parameter приводить не стоит.

На самом деле значения параметров по умолчанию должны появляться в объявлении, поскольку это единственное, что видит вызывающий.

Было бы хорошей практикой прокомментировать значения по умолчанию в списке повторяющихся аргументов функции:

void foo(int x = 42,
         int y = 21);

void foo(int x /* = 42 */,
         int y /* = 21 */)
{
   ...
}
person Emadpres    schedule 11.01.2015