Ошибка компилятора c2572

1 ответ

Сортировка:

Сброс на вариант по умолчанию

13

Вы, как правильно написано в сообщении об ошибке, дважды определили значение параметра по умолчанию. Можно только один раз.

Уберите значение по умолчанию из имплементации, всё будет работать как надо.

Улучшить ответ

изменён 19 фев 2013 в 9:35

ответ дан 18 фев 2013 в 18:23

VladD's user avatar

VladDVladD

206k27 золотых знаков290 серебряных знаков521 бронзовый знак

2

  • Спасибо, так компилируется

    – Pyatak

    18 фев 2013 в 20:57

  • пожалуйста!

    – VladD

    18 фев 2013 в 22:09

Добавить комментарий
 | 

Ваш ответ

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Имя

Почта

Необходима, но никому не показывается

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками

  • c++

или задайте свой вопрос.

description title ms.date f1_keywords helpviewer_keywords ms.assetid

Learn more about: Compiler Error C2572

Compiler Error C2572

11/04/2016

C2572

C2572

f1a42d69-727d-4ce5-88c8-d5f55dea66ac

Compiler Error C2572

‘class::member’ : redefinition of default parameter : parameter param

Default parameters cannot be redefined. If you require another value for the parameter, the default parameter should be left undefined.

The following sample generates C2572:

// C2572.cpp
// compile with: /c
void f(int i = 1);   // function declaration

// function definition
void f(int i = 1) {}   // C2572

// try the following line instead
// void f(int i) {}

【fishing-pan:https://blog.csdn.net/u013921430Перепечатка, пожалуйста, укажите источник]

предисловие

Обнаружена эта ошибка при отладкеC2572: «XXXX»: переопределить параметры по умолчанию, Часто, потому что значения по умолчанию установлены для параметров как в объявлении функции, так и в определении. Чтобы исправить эту ошибку, вам нужно только удалить значения по умолчанию формальных параметров в определении функции. (Примечание: вместо удаления формальных параметров значение по умолчанию удаляется). Например, в следующих случаях компилятор сообщит об ошибке;

Student (int a, char * n = "имя по умолчанию"); // Объявление функции
 Student :: Student (int a, char * n = "имя по умолчанию") // Определение функции
{ 
           / * Реализация функции * /
}

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

Student (int a, char * n = "имя по умолчанию"); // Объявление функции
 Student :: Student (int a, char * n) // Определение функции
{ 
           / * Реализация функции * /
}

Анализ проблем

Эта ошибка не является большой проблемой, потому что в процессе написания кода, чтобы избежать проблем, каждый обычно вставляет объявление функции непосредственно в определение функции. Что касается того, почему невозможно дать значения по умолчанию формальным параметрам одновременно в объявлении и определении функции, я ознакомился с некоторыми книгами и не дал четкого объяснения. Просто помни. (ОС: Разве это не анализ вообще?)

Я снова с любопытством подумал: не могли бы вы дать формальное значение по умолчанию для параметра в объявлении функции, но дать значение по умолчанию в определении? Поэтому я попробовал еще раз. Тест проводился под VS2013. Результаты теста также могут быть запущены. Но я проверил это в другой ситуации и обнаружил, что это не работает. В следующем случае это невозможно, поскольку, когда функция main () вызывает функцию func (), согласно объявлению функции, формальный параметр не имеет значения по умолчанию, поэтому при вызове функции значение параметра по умолчанию не может использоваться.

int func(int a);

void main()
{
	int aa = func(5);
	 int bb = func (); // ошибка
	cout << aa<<" ";
	cout << bb;
	system("pause");
	return;
}

int func(int a=3 )
{
	a += a;
	return a;
}

расширенный

Что еще произойдет, если в классе снова определите конструктор и установите для всех формальных параметров в конструкторе значения по умолчанию?

Student () {age = 20; name = "имя по умолчанию";} // Конструктор по умолчанию без формальных параметров
 Student (int a = 20, char * n = "имя по умолчанию"); // Конструктор по умолчанию со значениями по умолчанию для формальных параметров

Ответ в том, что вы сделали его конструктором по умолчанию;

Student NI; // ошибка, определены несколько конструкторов по умолчанию

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

Таким образом, есть два конструктора по умолчанию в C ++

1) Определить конструктор без параметров;

2) Определить все параметры имеют конструктор значений по умолчанию.

Сегодня, основываясь на одном вопросе, я сделал один случай и рассмотрел два других. ,

Это было завершено. ,

description title ms.date f1_keywords helpviewer_keywords ms.assetid

Learn more about: Compiler errors C2500 Through C2599

Compiler errors C2500 Through C2599

04/21/2019

C2501

C2508

C2515

C2519

C2520

C2522

C2525

C2527

C2536

C2538

C2539

C2546

C2547

C2559

C2560

C2564

C2565

C2576

C2578

C2580

C2590

C2591

C2595

C2596

C2501

C2508

C2515

C2519

C2520

C2522

C2525

C2527

C2536

C2538

C2539

C2546

C2547

C2559

C2560

C2564

C2565

C2576

C2578

C2580

C2590

C2591

C2595

C2596

a869aaed-e9f6-49e3-b273-00ea7f45bed7

Compiler errors C2500 Through C2599

The articles in this section of the documentation explain a subset of the error messages that are generated by the compiler.

[!INCLUDEerror-boilerplate]

Error messages

Error Message
Compiler error C2500 identifier1‘: ‘identifier2‘ is already a direct base class
Compiler error C2501 identifier‘: ‘__declspec(specifier)’ can only be applied to structs, unions, classes, or unsigned bit field members
Compiler error C2502 identifier‘: too many access modifiers on the base class
Compiler error C2503 class‘: base classes cannot contain zero-sized arrays
Compiler error C2504 class‘: base class undefined
Compiler error C2505 symbol‘: ‘__declspec(specifier)’ can only be applied to declarations or definitions of global objects or static data members
Compiler error C2506 member‘: ‘__declspec(specifier)’ cannot be applied to this symbol
Compiler error C2507 identifier‘: too many virtual modifiers on the base class
Compiler error C2508 identifier‘: ‘__declspec(specifier1)’ cannot be combined with ‘__declspec(specifier2)’
Compiler error C2509 identifier‘: member function not declared in ‘class
Compiler error C2510 identifier‘: left of ‘::’ must be a class/struct/union
Compiler error C2511 identifier‘: overloaded member function not found in ‘class
Compiler error C2512 identifier‘: no appropriate default constructor available
Compiler error C2513 ‘*type’: no variable declared before ‘=’
Compiler error C2514 class‘: class has no constructors
Compiler error C2515 identifier‘: ‘vtguard’ can only be applied to class declarations or definitions
Compiler error C2516 class‘: is not a legal base class
Compiler error C2517 identifier‘: right of ‘::’ is undefined
Compiler error C2518 keyword ‘keyword‘ illegal in base class list; ignored
Compiler error C2519 identifier‘: WinRT attributes may only contain public fields
Compiler error C2520 class‘: no non-explicit constructor available for implicit conversion
Compiler error C2521 a destructor/finalizer does not take any arguments
Compiler error C2522 identifier‘: Overload identifier cannot be used on ‘identifier1‘ as it’s already specified on ‘identifier2
Compiler error C2523 class::~identifier‘: destructor/finalizer tag mismatch
Compiler error C2524 identifier‘: a destructor/finalizer must have a ‘void’ parameter list
Compiler error C2525 identifier‘: The parameter ‘identifier1‘ is named ‘identifier2‘ on the base function and must be matched in a published implementation
Compiler error C2526 identifier1‘: C linkage function cannot return C++ class ‘identifier2
Compiler error C2527 identifier‘: DefaultOverload cannot be specified on both ‘function1‘ and ‘function2‘. Remove one specification or rename the function during implementation
Compiler error C2528 identifier‘: pointer to reference is illegal
Compiler error C2529 identifier‘: reference to reference is illegal
Compiler error C2530 identifier‘: references must be initialized
Compiler error C2531 identifier‘: reference to a bit field illegal
Compiler error C2532 identifier‘: illegal modifier for reference
Compiler error C2533 identifier‘: constructors not allowed a return type
Compiler error C2534 identifier‘: constructor cannot return a value
Compiler error C2535 identifier‘: member function already defined or declared
Compiler error C2536 Obsolete.
Compiler error C2537 specifier‘: illegal linkage specification
Compiler error C2538 Obsolete.
Compiler error C2539 Obsolete.
Compiler error C2540 non-constant expression as array bound
Compiler error C2541 identifier‘: cannot delete objects that are not pointers
Compiler error C2542 identifier‘: class object has no constructor for initialization
Compiler error C2543 expected ‘]’ for operator ‘[]’
Compiler error C2544 expected ‘)’ for operator ‘()’
Compiler error C2545 operator‘: unable to find overloaded operator
Compiler error C2546 identifier‘: when a type is defined in both a PIA and a no-PIA the PIA must be referenced first
Compiler error C2547 identifier‘: All parameters of a published method must be explicitly named on the declaration
Compiler error C2548 function‘: missing default parameter for parameter parameter
Compiler error C2549 user-defined conversion cannot specify a return type
Compiler error C2550 identifier‘: constructor initializer lists are only allowed on constructor definitions
Compiler error C2551 ‘void *’ type needs explicit cast
Compiler error C2552 identifier‘: non-aggregates cannot be initialized with an initializer list
Compiler error C2553 type derived_class::function‘: overriding virtual function return type differs from ‘type base_class::function
Compiler error C2555 derived_class::function‘: overriding virtual function return type differs and is not covariant from ‘base_class::function
Compiler error C2556 type1 class::function‘: overloaded function differs only by return type from ‘type2 class::function
Compiler error C2557 identifier‘: private and protected members cannot be initialized without a constructor
Compiler error C2558 class ‘class‘: no copy constructor available or copy constructor is declared ‘explicit’
Compiler error C2559 identifier‘: cannot overload a member function without ref-qualifier with a member function with ref-qualifier
Compiler error C2560 identifier‘: cannot overload a member function with ref-qualifier with a member function without ref-qualifier
Compiler error C2561 function‘: function must return a value
Compiler error C2562 function‘: ‘void’ function returning a value
Compiler error C2563 mismatch in formal parameter list
Compiler error C2564 Obsolete.
Compiler error C2565 identifier‘: ref-qualifier is illegal for constructors/destructors
Compiler error C2566 overloaded function in conditional expression
Compiler error C2567 unable to open metadata in ‘filename‘, possible_reason
Compiler error C2568 identifier‘: unable to resolve function overload
Compiler error C2569 identifier‘: enum/union cannot be used as a base class
Compiler error C2570 identifier‘: union cannot have base classes
Compiler error C2571 identifier‘: virtual function cannot be in union ‘union
Compiler error C2572 function‘: redefinition of default argument: parameter number
Compiler error C2573 class‘: cannot delete pointers to objects of this type; the class has no non-placement overload for ‘operator delete’. Use ::delete, or add ‘operator delete(void*)’ to the class
Compiler error C2574 destructor‘: cannot be declared static
Compiler error C2575 identifier‘: only member functions and bases can be virtual
Compiler error C2576 identifier‘: cannot introduce a new virtual method as ‘public’. Consider making the method non-virtual, or change the accessibility to ‘internal’ or ‘protected private’
Compiler error C2577 identifier‘: a destructor/finalizer cannot have a return type
Compiler error C2578 class‘: type cannot have a ‘protected’ or ‘protected public’ constructor
Compiler error C2579 unable to resolve type type (offset). It is expected in filename
Compiler error C2580 identifier‘: multiple versions of a defaulted special member functions are not allowed
Compiler error C2581 type‘: static ‘operator =’ function is illegal
Compiler error C2582 ‘operator operator‘ function is unavailable in ‘type
Compiler error C2583 identifier‘: ‘const/volatile’ ‘this’ pointer is illegal for constructors/destructors
Compiler error C2584 class‘: direct base ‘base_class2‘ is inaccessible; already a base of ‘base_class1
Compiler error C2585 explicit conversion to ‘type‘ is ambiguous
Compiler error C2586 incorrect user-defined conversion syntax: illegal indirections
Compiler error C2587 identifier‘: illegal use of local variable as default parameter
Compiler error C2588 ‘::~identifier‘: illegal global destructor/finalizer
Compiler error C2589 identifier‘: illegal token on right side of ‘::’
Compiler error C2590 identifier‘: only a constructor can have a base/member initializer list
Compiler error C2591 ExclusiveTo cannot use ‘type‘ as an argument. Only a ‘ref class’ is a valid argument
Compiler error C2592 class‘: ‘base_class2‘ is inherited from ‘base_class1‘ and cannot be re-specified
Compiler error C2593 ‘operator identifier‘ is ambiguous
Compiler error C2594 operator‘: ambiguous conversions from ‘type1‘ to ‘type2
Compiler error C2595 identifier‘ A WinRT attribute type must be sealed
Compiler error C2596 identifier‘ A WinRT attribute field can only be a ‘public enum class’, ‘int’, ‘unsigned int’, ‘bool’, ‘Platform::Type’, ‘Platform::String’ or ‘Windows::Foundation::HResult’
Compiler error C2597 illegal reference to non-static member ‘identifier
Compiler error C2598 linkage specification must be at global scope
Compiler error C2599 identifier‘: the forward declaration of a managed/WinRT enum is not allowed

See also

C/C++ Compiler and build tools errors and warnings
Compiler errors C2000 — C3999, C7000 — C7999

888224

1 / 1 / 0

Регистрация: 27.10.2020

Сообщений: 100

1

Как исправить ошибку «переопределение аргумента по умолчанию»?

09.06.2021, 21:39. Показов 720. Ответов 4

Метки c++ (Все метки)


Студворк — интернет-сервис помощи студентам

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Item* read_array_from_file(int& size, bool for_add = false)
{
    ifstream ifile;
    if (!open_file_for_read(ifile)) return nullptr;
 
    ifile.read((char*)&size, sizeof(int));    // читаем кол-во записей
    Item* records = new Item[size + (int)for_add];    // массив создаем под чтение записей
 
    for (int i = 0; i < size; i++)
        ifile.read((char*)&records[i], sizeof(Item));    // читаем очередную запись    
    ifile.close();
    return records;
}

Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка C2572 read_array_from_file: переопределение аргумента по умолчанию: параметр 1



0



1704 / 1104 / 337

Регистрация: 25.01.2019

Сообщений: 2,903

09.06.2021, 21:48

2

Цитата
Сообщение от 888224
Посмотреть сообщение

переопределение аргумента по умолчанию: параметр 1

У тебя есть объявление функции без определения? Там оставь по умолчанию, из определения убери. Такая штука(значение по умолчанию) должна быть одна.



0



888224

1 / 1 / 0

Регистрация: 27.10.2020

Сообщений: 100

09.06.2021, 21:53

 [ТС]

3

Folian,

C++
1
Item* read_array_from_file(int& size, bool for_add = false);//вот объявление



0



1704 / 1104 / 337

Регистрация: 25.01.2019

Сообщений: 2,903

09.06.2021, 21:55

4

Цитата
Сообщение от 888224
Посмотреть сообщение

вот объявление

вот тут = false оставь, а из определения убери.



0



1 / 1 / 0

Регистрация: 27.10.2020

Сообщений: 100

09.06.2021, 21:55

 [ТС]

5

Folian,
тут убрать?
и что конкретно?

Добавлено через 31 секунду
Folian,
Спасибо



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

09.06.2021, 21:55

5

#cpp


Ошибка: error C2572: 'foo' : redefinition of default parameter : parameter 1

Мне необходимо сначала объявить функцию, а затем определить её. При этом необходимо
задать один параметр как параметр по умолчанию. Но не получается. Почему?
void foo(int i = 1); //объявляем функцию

void foo(int i = 1) //тут нужно определить
{

}
    

Ответы

Ответ 1

Вы, как правильно написано в сообщении об ошибке, дважды определили значение параметра по умолчанию. Можно только один раз. Уберите значение по умолчанию из имплементации, всё будет работать как надо.

Понравилась статья? Поделить с друзьями:
  • Ошибка компиляции встроенного языка
  • Ошибка компиляции видеофильма диск заполнен
  • Ошибка компиляции видеофильма premiere pro неизвестная ошибка
  • Ошибка компиляции ардуино про мини
  • Ошибка компиляции vba