Объявите функцию со значением указателя по умолчанию

0

Я пытаюсь объявить эту функцию в файле.cpp, но получить ошибку компиляции:

error: аргумент по умолчанию, заданный для параметра 2 'void print_vector (std :: vector &, char *)'

void print_vector(vector<int>&c, char *title="");

Как я могу объявить это правильно?

Теги:

2 ответа

1
Лучший ответ

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

Т.е. вместо

// 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, спасибо!).

  • 2
    Строго говоря, преобразование строкового литерала в char * больше не является простым предупреждением. Он был полностью удален из языка C ++ 11.
  • 0
    @ Огук, ты прав. Моя реализация такая же, как и объявить, как в первой части вашего ответа. Как только я изменяю это на 2-ой парк, это работает.
Показать ещё 8 комментариев
0

Объявление функции говорит только о том, как можно вызвать эту функцию. Он не должен совпадать, и в некоторых случаях он может не совпадать. Рассмотрим случай:

class T
{
   static int GetDefault();
};

int T::GetDefault()
{
   return 0;
}

Здесь не требуется использовать static ключевое слово в реализации. Некоторый компилятор может выдавать предупреждение, или какой-то статический аналитический инструмент меня предупреждает (хотя это и не наносит вреда). Кроме того, обратите внимание, что имя параметра может не совпадать (или может быть опущено в объявлении или реализации), поскольку для вызывающих требуется только базовый прототип.

int Compute(int,int);
int Compute(int a, int b) 
{
    return a*b;
}

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню