Аргумент по умолчанию не используется
Я вызываю эту функцию
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, вы, вероятно, захотите переместить определение аргумента по умолчанию в объявление функции в файле заголовка.