1 ответ
Сортировка:
Сброс на вариант по умолчанию
13
Вы, как правильно написано в сообщении об ошибке, дважды определили значение параметра по умолчанию. Можно только один раз.
Уберите значение по умолчанию из имплементации, всё будет работать как надо.
Улучшить ответ
изменён 19 фев 2013 в 9:35
ответ дан 18 фев 2013 в 18:23
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++
или задайте свой вопрос.
Всё ещё ищете ответ? Посмотрите другие вопросы с метками
- 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 |
|
|
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++ (Все метки)
Серьезность Код Описание Проект Файл Строка Состояние подавления
0 |
1704 / 1104 / 337 Регистрация: 25.01.2019 Сообщений: 2,903 |
|
09.06.2021, 21:48 |
2 |
переопределение аргумента по умолчанию: параметр 1 У тебя есть объявление функции без определения? Там оставь по умолчанию, из определения убери. Такая штука(значение по умолчанию) должна быть одна.
0 |
888224 1 / 1 / 0 Регистрация: 27.10.2020 Сообщений: 100 |
||||
09.06.2021, 21:53 [ТС] |
3 |
|||
Folian,
0 |
1704 / 1104 / 337 Регистрация: 25.01.2019 Сообщений: 2,903 |
|
09.06.2021, 21:55 |
4 |
вот объявление вот тут
0 |
1 / 1 / 0 Регистрация: 27.10.2020 Сообщений: 100 |
|
09.06.2021, 21:55 [ТС] |
5 |
Folian, Добавлено через 31 секунду
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
Вы, как правильно написано в сообщении об ошибке, дважды определили значение параметра по умолчанию. Можно только один раз. Уберите значение по умолчанию из имплементации, всё будет работать как надо.