Roctislav 0 / 0 / 0 Регистрация: 13.10.2019 Сообщений: 10 |
||||
1 |
||||
03.11.2019, 18:49. Показов 10178. Ответов 6 Метки нет (Все метки)
Добрый вечер, при создании пользовательской функции через void, появляется следующая ошибка: «error C2082: переопределение формального параметра «f»». В чем она заключается и как ее исправить?
__________________
0 |
фрилансер 4478 / 3988 / 870 Регистрация: 11.10.2019 Сообщений: 10,503 |
|
03.11.2019, 19:00 |
2 |
Сообщение было отмечено Roctislav как решение Решение строка 22 тебе не надо там переопределять, убери «double»
1 |
ddvamp1 24 / 14 / 10 Регистрация: 11.08.2019 Сообщений: 59 |
||||
03.11.2019, 19:01 |
3 |
|||
Сообщение было отмечено Roctislav как решение Решение
Вы в теле функции определяете новую, локальную переменную f, вместо того, чтобы записывать значение в старую, переданную аргументом
1 |
Алексей1153 фрилансер 4478 / 3988 / 870 Регистрация: 11.10.2019 Сообщений: 10,503 |
||||
03.11.2019, 19:02 |
4 |
|||
а ещё лучше вот так
1 |
«C with Classes» 1610 / 1383 / 518 Регистрация: 16.08.2014 Сообщений: 5,755 Записей в блоге: 1 |
|
03.11.2019, 19:02 |
5 |
при создании пользовательской функции через void круто излагаешь
0 |
0 / 0 / 0 Регистрация: 13.10.2019 Сообщений: 10 |
|
03.11.2019, 19:04 [ТС] |
6 |
Все заработало, спасибо.
0 |
Just Do It! 3427 / 1897 / 624 Регистрация: 23.09.2014 Сообщений: 5,991 Записей в блоге: 1 |
|
03.11.2019, 19:04 |
7 |
при создании пользовательской функции через void А разве в С++/CLR есть void?
0 |
Содержание
- Ошибка C2082: переопределение формального параметра ‘tmp’
- Решение
- Другие решения
- Ошибки компилятора с C2000 по C2099
- Ошибки компилятора с C2000 по C2099
- Ошибка C2082: переопределение формального параметра ‘tmp’
- 3 ответа
- Ошибка C2082: переопределение формального параметра ‘tmp’
Ошибка C2082: переопределение формального параметра ‘tmp’
Сценарий: у меня есть функция, которая вызывает параметризованный конструктор, когда я хочу инициализировать. Поэтому я хочу вызывать конструктор по своему выбору, когда захочу. Но это работает, когда я использую A() вызвать конструктор по умолчанию, но он не работает с конструктором с параметром, а я получаю следующую ошибку.
Ошибка 1 ошибка C2082: переопределение формального параметра
‘tmp’ c: users adnan Documents visual studio
2012 projects project3 project3 source.cpp 12 1 Project3
Решение
В вашей функции члена i ты пытаешься позвонить A как это:
по факту A(tmp) объявляет переменную tmp типа A , поскольку tmp уже объявлен как int внутри той же области компилятор жалуется.
Если вы хотите переменную типа A и инициализировать его через A::A(int) Тогда вам нужно дать имя этой переменной. Например.:
Другие решения
не вызывает конструктор, он объявляет экземпляр A называется «ТМП» — это эквивалентно
Поскольку формальный параметр называется «tmp», это переопределение.
(Несмотря на то, что вы могли ожидать, A tmp(); является не эквивалентно A tmp; — ищите «самый неприятный анализ», чтобы узнать больше.)
Причина, по которой он «работает», когда вы пишете
является то, что он создает анонимный экземпляр (совершенно другой this ) который сразу выбрасывается
Другими словами, этот код не делает то, о чем вы думали.
В C ++ 03 нет способа явно вызвать конструктор, кроме как с помощью «размещения нового», что нельзя делать, если вы не знаете, что делаете.
Если вы хотите отложить «инициализацию» объекта до того, как он будет построен, используйте функцию инициализации:
В грамматике существует двусмысленность, связанная с выражениями-выражениями
и декларации:
Я процитировал Стандарт C ++.
Что в этом фрагменте кода
А (TMP); рассматривается компилятором как объявление, эквивалентное
Чтобы отличить вызов конструктора от объявления, вы можете написать
В этом случае (A) (tmp) является вызовом конструктора, хотя в этом утверждении нет никакого смысла.
Источник
Ошибки компилятора с C2000 по C2099
В статьях в этом разделе документации объясняется подмножество сообщений об ошибках, создаваемых компилятором.
Компиляторы и средства сборки Visual Studio могут сообщать о различных типах ошибок и предупреждений. После обнаружения ошибки или предупреждения средства сборки могут делать предположения о намерении кода и пытаться продолжить работу, чтобы можно было сообщать о дополнительных проблемах одновременно. Если средства делают неверное предположение, последующие ошибки или предупреждения не могут применяться к проекту. При устранении проблем в проекте всегда начинайте с первой зарегистрированной ошибки (или предупреждения) и выполняйте повторную сборку как можно чаще. Одно исправление может привести к возникновению многих последующих ошибок.
Чтобы получить справку о конкретном диагностическом сообщении в Visual Studio, выберите его в окне вывода и нажмите клавишу F1 . Visual Studio открывает страницу документации для этой ошибки, если она существует. Вы также можете использовать средство поиска в верхней части страницы, чтобы найти статьи о конкретных ошибках или предупреждениях. Кроме того, просмотрите список ошибок и предупреждений по инструменту и введите оглавление на этой странице.
Не все ошибки или предупреждения Visual Studio описаны. Во многих случаях диагностическое сообщение предоставляет все доступные сведения. Если вы приземлились на этой странице при использовании F1 и считаете, что сообщение об ошибке или предупреждении требует дополнительного объяснения, сообщите нам об этом. Кнопки обратной связи на этой странице можно использовать для создания проблемы с документацией на сайте GitHub. Если вы считаете, что ошибка или предупреждение неправы или обнаружена другая проблема с набором инструментов, сообщите о проблеме с продуктом на сайте Сообщество разработчиков. Вы также можете отправить отзыв и ввести ошибки в интегрированной среде разработки. В Visual Studio перейдите в строку меню и выберите «Отправить > отзыв справки>» или отправьте предложение с помощью отправки > отзывов > справки.
Вы можете найти дополнительную помощь по ошибкам и предупреждениям на форумах Microsoft Learn Q&A . Или найдите номер ошибки или предупреждения на сайте Сообщество разработчиков Visual Studio C++. Вы также можете выполнить поиск решений в Stack Overflow .
Ссылки на дополнительные справочные материалы и ресурсы сообщества см. в справке и сообществе Visual C++.
Источник
Ошибки компилятора с C2000 по C2099
В статьях в этом разделе документации объясняется подмножество сообщений об ошибках, создаваемых компилятором.
Компиляторы и средства сборки Visual Studio могут сообщать о различных типах ошибок и предупреждений. После обнаружения ошибки или предупреждения средства сборки могут делать предположения о намерении кода и пытаться продолжить работу, чтобы можно было сообщать о дополнительных проблемах одновременно. Если средства делают неверное предположение, последующие ошибки или предупреждения не могут применяться к проекту. При устранении проблем в проекте всегда начинайте с первой зарегистрированной ошибки (или предупреждения) и выполняйте повторную сборку как можно чаще. Одно исправление может привести к возникновению многих последующих ошибок.
Чтобы получить справку о конкретном диагностическом сообщении в Visual Studio, выберите его в окне вывода и нажмите клавишу F1 . Visual Studio открывает страницу документации для этой ошибки, если она существует. Вы также можете использовать средство поиска в верхней части страницы, чтобы найти статьи о конкретных ошибках или предупреждениях. Кроме того, просмотрите список ошибок и предупреждений по инструменту и введите оглавление на этой странице.
Не все ошибки или предупреждения Visual Studio описаны. Во многих случаях диагностическое сообщение предоставляет все доступные сведения. Если вы приземлились на этой странице при использовании F1 и считаете, что сообщение об ошибке или предупреждении требует дополнительного объяснения, сообщите нам об этом. Кнопки обратной связи на этой странице можно использовать для создания проблемы с документацией на сайте GitHub. Если вы считаете, что ошибка или предупреждение неправы или обнаружена другая проблема с набором инструментов, сообщите о проблеме с продуктом на сайте Сообщество разработчиков. Вы также можете отправить отзыв и ввести ошибки в интегрированной среде разработки. В Visual Studio перейдите в строку меню и выберите «Отправить > отзыв справки>» или отправьте предложение с помощью отправки > отзывов > справки.
Вы можете найти дополнительную помощь по ошибкам и предупреждениям на форумах Microsoft Learn Q&A . Или найдите номер ошибки или предупреждения на сайте Сообщество разработчиков Visual Studio C++. Вы также можете выполнить поиск решений в Stack Overflow .
Ссылки на дополнительные справочные материалы и ресурсы сообщества см. в справке и сообществе Visual C++.
Источник
Ошибка C2082: переопределение формального параметра ‘tmp’
Сценарий: у меня есть функция, которая вызывает параметризованный конструктор, когда я хочу инициализировать. Так что я хочу сделать, чтобы вызвать конструктор по своему выбору, когда захочу. Но он работает, когда я использую A() для вызова конструктора по умолчанию, но он не работает с конструктором с параметром, а я получаю следующую ошибку.
Ошибка 1 ошибка C2082: переопределение формального параметра ‘tmp’ c:usersadnandocumentsvisual studio 2012projectsproject3project3source.cpp 12 1 Project3
3 ответа
В вашей функции-члене i вы пытаетесь вызвать c’tor A следующим образом:
Фактически A(tmp) объявляет переменную tmp типа A Поскольку tmp уже объявлен как int внутри одной и той же области, компилятор жалуется.
Если вы хотите переменную типа A и инициализировать ее с помощью A::A(int) c’tor, вам нужно указать имя этой переменной. Например:
не вызывает конструктор, он объявляет экземпляр A под названием «tmp» — он эквивалентен
Поскольку формальный параметр называется «tmp», это переопределение.
(Несмотря на то, что вы ожидаете, A tmp(); не эквивалентен A tmp; — найдите «самый неприятный синтаксический разбор», чтобы узнать больше.)
Причина, по которой он «работает», когда вы пишете
заключается в том, что он создает анонимный экземпляр (совершенно другой из this ), который сразу же отбрасывается.
Другими словами, этот код не делает то, что вы считали.
Там нет способа (в С++ 03) явно вызвать конструктор, кроме использования «размещения нового», что не должно быть сделано, если вы не знаете, что делаете.
Если вы хотите отложить «инициализацию» объекта до его создания, используйте функцию инициализации:
Источник
Ошибка C2082: переопределение формального параметра ‘tmp’
Сценарий: у меня есть функция, которая вызывает параметризованный конструктор, когда я хочу инициализировать. Так что я хочу сделать, чтобы вызвать конструктор по своему выбору, когда захочу. Но он работает, когда я использую A() для вызова конструктора по умолчанию, но он не работает с конструктором с параметром, а я получаю следующую ошибку.
Ошибка 1 ошибка C2082: переопределение формального параметра ‘tmp’ c:usersadnandocumentsvisual studio 2012projectsproject3project3source.cpp 12 1 Project3
В вашей функции-члене i вы пытаетесь вызвать c’tor A следующим образом:
Фактически A(tmp) объявляет переменную tmp типа A Поскольку tmp уже объявлен как int внутри одной и той же области, компилятор жалуется.
Если вы хотите переменную типа A и инициализировать ее с помощью A::A(int) c’tor, вам нужно указать имя этой переменной. Например:
не вызывает конструктор, он объявляет экземпляр A под названием «tmp» — он эквивалентен
Поскольку формальный параметр называется «tmp», это переопределение.
(Несмотря на то, что вы ожидаете, A tmp(); не эквивалентен A tmp; — найдите «самый неприятный синтаксический разбор», чтобы узнать больше.)
Причина, по которой он «работает», когда вы пишете
заключается в том, что он создает анонимный экземпляр (совершенно другой из this ), который сразу же отбрасывается.
Другими словами, этот код не делает то, что вы считали.
Там нет способа (в С++ 03) явно вызвать конструктор, кроме использования «размещения нового», что не должно быть сделано, если вы не знаете, что делаете.
Если вы хотите отложить «инициализацию» объекта до его создания, используйте функцию инициализации:
Источник
C++ beginner here with a functions error, I get the error «redefinition of formal parameter». What does this mean? and how can I fix it.
int getGuessFromUser(int guess)
{
std::cout << "Guess my lucky number between 0 and 10: ";
int guess;
std::cin >> guess;
return guess;
}
asked Sep 7, 2021 at 23:27
4
You have a parameter int guess
and a variable int guess
You don’t seem to be using the parameter, so perhaps remove it?
int getGuessFromUser()
{
std::cout << "Guess my lucky number between 0 and 10: ";
int guess;
std::cin >> guess;
return guess;
}
answered Sep 7, 2021 at 23:34
Jiří BaumJiří Baum
6,5672 gold badges15 silver badges17 bronze badges
2
You are getting this error because you have already declared the parameter guess in you getGuessFromUser function. You do not need to declare it again, so you can remove the line int guess
answered Sep 7, 2021 at 23:30
You have a function parameter named guess
and also a local variable with the exact same name.
This would be just like declaring two variables with the same name in the same scope (like a function), which is not allowed.
Change one of the names to remove the error.
answered Sep 7, 2021 at 23:30
Lev M.Lev M.
5,9351 gold badge9 silver badges22 bronze badges
C++ beginner here with a functions error, I get the error «redefinition of formal parameter». What does this mean? and how can I fix it.
int getGuessFromUser(int guess)
{
std::cout << "Guess my lucky number between 0 and 10: ";
int guess;
std::cin >> guess;
return guess;
}
asked Sep 7, 2021 at 23:27
4
You have a parameter int guess
and a variable int guess
You don’t seem to be using the parameter, so perhaps remove it?
int getGuessFromUser()
{
std::cout << "Guess my lucky number between 0 and 10: ";
int guess;
std::cin >> guess;
return guess;
}
answered Sep 7, 2021 at 23:34
Jiří BaumJiří Baum
6,5672 gold badges15 silver badges17 bronze badges
2
You are getting this error because you have already declared the parameter guess in you getGuessFromUser function. You do not need to declare it again, so you can remove the line int guess
answered Sep 7, 2021 at 23:30
You have a function parameter named guess
and also a local variable with the exact same name.
This would be just like declaring two variables with the same name in the same scope (like a function), which is not allowed.
Change one of the names to remove the error.
answered Sep 7, 2021 at 23:30
Lev M.Lev M.
5,9351 gold badge9 silver badges22 bronze badges
Сценарий: у меня есть функция, которая вызывает параметризованный конструктор, когда я хочу инициализировать. Поэтому я хочу вызывать конструктор по своему выбору, когда захочу. Но это работает, когда я использую A()
вызвать конструктор по умолчанию, но он не работает с конструктором с параметром, а я получаю следующую ошибку.
Ошибка 1 ошибка C2082: переопределение формального параметра
‘tmp’ c: users adnan Documents visual studio
2012 projects project3 project3 source.cpp 12 1 Project3
class A
{
public:
int id;
void i(int tmp)
{
A(tmp);
}
A()
{
cout<<"default const"<<endl;
}
A(int id)
{
this->id = id;
}
};
int main()
{
A obj[2];
for(int i=0;i<2;i++)
{
obj[i].i(i*2);
}
cout<<"obj[0].id = "<<obj[0].id;
cout<<endl;
cout<<"obj[1].id = "<<obj[1].id;
cout<<endl;system("pause");
return 0;
}
0
Решение
В вашей функции члена i
ты пытаешься позвонить A
как это:
void i(int tmp)
{
A(tmp);
}
по факту A(tmp)
объявляет переменную tmp
типа A
, поскольку tmp
уже объявлен как int
внутри той же области компилятор жалуется.
Если вы хотите переменную типа A
и инициализировать его через A::A(int)
Тогда вам нужно дать имя этой переменной. Например.:
A a(tmp);
3
Другие решения
Линия
A(tmp);
не вызывает конструктор, он объявляет экземпляр A
называется «ТМП» — это эквивалентно
A tmp;
Поскольку формальный параметр называется «tmp», это переопределение.
(Несмотря на то, что вы могли ожидать, A tmp();
является не эквивалентно A tmp;
— ищите «самый неприятный анализ», чтобы узнать больше.)
Причина, по которой он «работает», когда вы пишете
A();
является то, что он создает анонимный экземпляр (совершенно другой this
) который сразу выбрасывается
Другими словами, этот код не делает то, о чем вы думали.
В C ++ 03 нет способа явно вызвать конструктор, кроме как с помощью «размещения нового», что нельзя делать, если вы не знаете, что делаете.
Если вы хотите отложить «инициализацию» объекта до того, как он будет построен, используйте функцию инициализации:
class A
{
public:
int id;
void init(int tmp)
{
id = tmp;
}
A()
{
cout<<"default const"<<endl;
init(0); // Avoid accidental undefined behaviour.
}
A(int id)
{
init(id);
}
};
1
В грамматике существует двусмысленность, связанная с выражениями-выражениями
и декларации:
Я процитировал Стандарт C ++.
Что в этом фрагменте кода
void i(int tmp)
{
A(tmp);
}
А (TMP); рассматривается компилятором как объявление, эквивалентное
A tmp;
Чтобы отличить вызов конструктора от объявления, вы можете написать
void i(int tmp)
{
( A )( tmp );
}
В этом случае (A) (tmp) является вызовом конструктора, хотя в этом утверждении нет никакого смысла.
0
The line
A(tmp);
doesn’t call the constructor, it’s declaring an instance of A
called «tmp» — it’s equivalent to
A tmp;
Since the formal parameter is called «tmp», that’s a redefinition.
(Despite what you might expect, A tmp();
is not equivalent to A tmp;
— look for «the most vexing parse» to learn more.)
The reason it «works» when you write
A();
is that it creates an anonymous instance (an entirely different one from this
) which is immediately thrown away.
In other words, that code doesn’t do what you thought it did.
There’s no way (in C++03) to explicitly call a constructor except using «placement new», which should not be done unless you know what you’re doing.
If you want to delay «initialization» of an object until after it’s been constructed, use an initialization function:
class A
{
public:
int id;
void init(int tmp)
{
id = tmp;
}
A()
{
cout<<"default const"<<endl;
init(0); // Avoid accidental undefined behaviour.
}
A(int id)
{
init(id);
}
};
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> //----------------------------------------------------------------------------- int* createArr(unsigned size) { int* arr = malloc(sizeof(int) * size); unsigned i; for (i = 0; i < size; ++i) { arr[i] = rand() % 10; } return arr; } //----------------------------------------------------------------------------- void show(int* arr, unsigned size) { unsigned i; for (i = 0; i < size; ++i) { printf("%d ", arr[i]); } printf("n"); } //----------------------------------------------------------------------------- int* merge(int* arr1, unsigned size1, int* arr2, unsigned size2) { int* arr = malloc(sizeof(int) * (size1 + size2)); memcpy(arr, arr1, sizeof(int) * size1); memcpy(arr + size1, arr2, sizeof(int) * size2); return arr; } //----------------------------------------------------------------------------- int main() { unsigned size = 5; int* mas1, * mas2, * mas3; srand(time(NULL)); mas1 = createArr(size); show(mas1, size); mas2 = createArr(size); show(mas2, size); mas3 = merge(mas1, size, mas2, size); show(mas3, 2 * size); return 0; }
В конце книги Лафоре есть ответы на некоторые его задачи. Есть ответ и на эту задачу.
Вот (нерабочий) ответ, из оригинала книги
Спойлер
// ex9_2.cpp
//inheritance from String class
#include <iostream>
#include <cstring> //for strcpy(), etc.
using namespace std;
////////////////////////////////////////////////////////////////
class String //base class
{
protected: //Note: can’t be private
enum { SZ = 80 }; //size of all String objects
char str[SZ]; //holds a C-string
public:
String() //constructor 0, no args
{
str[0] = ‘0’;
}
String(char s[]) //constructor 1, one arg
{
strcpy(str, s);
} // convert string to String
void display() const //display the String
{
cout << str;
}
operator char*() //conversion function
{
return str;
} //convert String to C-string
};
////////////////////////////////////////////////////////////////
class Pstring : public String //derived class
{
public:
Pstring(char s[]); //constructor
};
//--------------------------------------------------------------
Pstring::Pstring(char s[]) //constructor for Pstring
{
if (strlen(s) > SZ - 1) //if too long,
{
for (int j = 0; j < SZ - 1; j++) //copy the first SZ-1
str[j] = s[j]; //characters “by hand”
str[j] = ‘0’; //add the null character
}
else //not too long,
String(s); //so construct normally
}
////////////////////////////////////////////////////////////////
int main()
{ //define String
Pstring s1 = “This is a very long string which is probably “
“no, certainly--going to exceed the limit set by SZ.”;
cout << “ns1 = ”; s1.display(); //display String
Pstring s2 = “This is a short string.”; //define String
cout << “ns2 = ”; s2.display(); //display String
cout << endl;
return 0;
}
Непонятно почему в этом скрипте вызывается конструктор базового класса из тела конструктора производного класса.
@JustHack
Понятно, но в списке инициализации нельзя выполнить какое-либо условие (а оно должно быть в этой задаче), потому видимо вызов конструктора базового класса и был перенесен в тело конструктора.
В интернете нашел еще такое решение,
вместо вызова конструктора
else //not too long,
String(s);
использовать уже непосредственно саму функцию того конструктора
else //not too long,
strcpy_s(str, s);
Изменено 25 апреля, 2019 пользователем Antonshka