Аргумент по умолчанию не используется

Я вызываю эту функцию

void Board::insertWord(const string& s, const Clue& clue, 
    bool recordLetters=true) {
  ...
}

Вот

insertWord( newWord, curClue );

где newWord а также curClue Строка и Подсказка, соответственно. Я не могу понять, почему значение по умолчанию не используется для третьего аргумента.

g++ -c -std=c++11 -Wall -g board.cpp -o board.o
board.cpp: In member function ‘void Board::processUntilValid()’:
board.cpp:78:38: error: no matching function for call to ‘Board::insertWord(std::string&, const Clue&)’
         insertWord( newWord, curClue );
                                      ^
board.cpp:78:38: note: candidate is:
In file included from board.cpp:1:0:
board.h:42:10: note: void Board::insertWord(const string&, const Clue&, bool)
     void insertWord(const string& s, const Clue& c, bool recordLetters);
          ^
board.h:42:10: note:   candidate expects 3 arguments, 2 provided

Я не смог воспроизвести проблему. Есть идеи?

3 ответа

Решение

Это:

void Board::insertWord(const string& s, const Clue& clue, 
                       bool recordLetters=true) { /* ... */ }

... это определение Board::insertWord, В C++ вы не ставите аргумент по умолчанию при определении метода, но при их объявлении, поэтому ваш код, вероятно, должен выглядеть так:

class Board {
    // Declaration:
    void insertWord(const string& s, const Clue& clue, 
                    bool recordLetters = true);
};

// Definition:
void Board::insertWord(const string& s, const Clue& clue, 
                       bool recordLetters) { /* ... */ } // No default argument

Аргументы по умолчанию принадлежат декларации (.h) а не по определению (.cpp).

Аргументы по умолчанию являются свойством определенного объявления функции, а не самой функции. Каждый вызывающий объект оценивает аргументы по умолчанию на основе объявления (й) функции, которую он видел.

Вполне возможно (если неразумно) иметь такую ​​настройку:

a.cpp

void foo(int i = 42);

void a()
{
  foo();
}

b.cpp

void foo(int i = -42);

void b()
{
  foo();
}

main.cpp

#include <iostream>

void a();
void b();

void foo(int i)
{
  std::cout << i << '\n';
}

int main()
{
  a();
  b();
}

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

Итак, в вашем случае вы должны убедиться, что вызывающая сторона имеет доступ к объявлению, которое определяет аргумент по умолчанию. Это объявление является определением функции в вашем случае. Если это скрыто в файле.cpp, вы, вероятно, захотите переместить определение аргумента по умолчанию в объявление функции в файле заголовка.

Другие вопросы по тегам