Я пытаюсь объявить эту функцию в файле.cpp, но получить ошибку компиляции:
error: аргумент по умолчанию, заданный для параметра 2 'void print_vector (std :: vector &, char *)'
void print_vector(vector<int>&c, char *title="");
Как я могу объявить это правильно?
Выводимая декларация недостаточно для создания этой ошибки, но она может возникнуть, если вы отделите объявление функции и реализацию и случайно присвоите значение по умолчанию в обоих случаях. Обязательно укажите только параметр по умолчанию в одном из них.
Т.е. вместо
// declaration, usually in .h
void print_vector(vector<int>&c, const char *title="");
// implementation, usually in .cpp
void print_vector(vector<int>&c, const char *title="") {
// code
}
делать
// declaration, usually in .h
void print_vector(vector<int>&c, const char *title="");
// implementation, usually in .cpp
void print_vector(vector<int>&c, const char *title) {
// code
}
или наоборот, то есть со значением по умолчанию в реализации (хотя предпочтительный способ, показанный выше, является предпочтительным, поскольку он делает поведение и использование понятными для читателя вашего файла заголовка). Также обратите внимание на const char *, чтобы избежать предупреждений (или даже ошибок, отмеченных AndreyT, спасибо!).
Объявление функции говорит только о том, как можно вызвать эту функцию. Он не должен совпадать, и в некоторых случаях он может не совпадать. Рассмотрим случай:
class T
{
static int GetDefault();
};
int T::GetDefault()
{
return 0;
}
Здесь не требуется использовать static
ключевое слово в реализации. Некоторый компилятор может выдавать предупреждение, или какой-то статический аналитический инструмент меня предупреждает (хотя это и не наносит вреда). Кроме того, обратите внимание, что имя параметра может не совпадать (или может быть опущено в объявлении или реализации), поскольку для вызывающих требуется только базовый прототип.
int Compute(int,int);
int Compute(int a, int b)
{
return a*b;
}
В случае аргумента по умолчанию вы указываете аргумент по умолчанию для вызывающих абонентов, а не для реализации самой функции (если только она не реализована внутри класса).
char *
больше не является простым предупреждением. Он был полностью удален из языка C ++ 11.