Here is my class:
#ifndef CLOCK_H
#define CLOCK_H
using namespace std;
class Clock
{
//Member Variables
private: int hours, minutes;
void fixTime( );
public:
//Getter & settor methods.
void setHours(int hrs);
int getHours() const;
void setMinutes(int mins);
int getMinutes() const;
//Constructors
Clock();
Clock(int);
Clock(int, int);
//Copy Constructor
Clock(const Clock &obj);
//Overloaded operator functions
void operator+(const Clock &hours);
void operator+(int mins);
void operator-(const Clock &hours);
void operator-(int minutes1);
ostream &operator<<(ostream &out, Clock &clockObj); //This however is my problem where i get the error C2804. Saying that it has to many parameters
};
#endif
All this function is supposed to do is out the values of a clock at different times.
asked Apr 3, 2013 at 2:37
2
ostream &operator<<(ostream &out, Clock &clockObj);
should be
friend ostream &operator<<(ostream &out, Clock &clockObj);
According to Stanley et al’s C++ Primer (Fourth Edition pp 514):
When we define an input or output operator that conforms to the
conventions of the iostream library, we must make it a nonmember
operator. We cannot make the operator a member of our own class. If we
did, then the left-hand operand would have to be an object of our
class type
Therefore, it is good practice to overload <<
and >>
as friend functions of the class.
answered Apr 3, 2013 at 2:41
taocptaocp
23.2k10 gold badges49 silver badges62 bronze badges
1
Here is my class:
#ifndef CLOCK_H
#define CLOCK_H
using namespace std;
class Clock
{
//Member Variables
private: int hours, minutes;
void fixTime( );
public:
//Getter & settor methods.
void setHours(int hrs);
int getHours() const;
void setMinutes(int mins);
int getMinutes() const;
//Constructors
Clock();
Clock(int);
Clock(int, int);
//Copy Constructor
Clock(const Clock &obj);
//Overloaded operator functions
void operator+(const Clock &hours);
void operator+(int mins);
void operator-(const Clock &hours);
void operator-(int minutes1);
ostream &operator<<(ostream &out, Clock &clockObj); //This however is my problem where i get the error C2804. Saying that it has to many parameters
};
#endif
All this function is supposed to do is out the values of a clock at different times.
asked Apr 3, 2013 at 2:37
2
ostream &operator<<(ostream &out, Clock &clockObj);
should be
friend ostream &operator<<(ostream &out, Clock &clockObj);
According to Stanley et al’s C++ Primer (Fourth Edition pp 514):
When we define an input or output operator that conforms to the
conventions of the iostream library, we must make it a nonmember
operator. We cannot make the operator a member of our own class. If we
did, then the left-hand operand would have to be an object of our
class type
Therefore, it is good practice to overload <<
and >>
as friend functions of the class.
answered Apr 3, 2013 at 2:41
taocptaocp
23.2k10 gold badges49 silver badges62 bronze badges
1
description | title | ms.date | f1_keywords | helpviewer_keywords | ms.assetid |
---|---|---|---|---|---|
Learn more about: Compiler Error C2804 |
Compiler Error C2804 |
11/04/2016 |
C2804 |
C2804 |
b066e563-cca4-450c-8ba7-3b0d7a89f3ea |
Compiler Error C2804
binary ‘operator operator’ has too many parameters
The overloaded binary operator member function is declared with more than one parameter. The first operand parameter of a binary operator member function, whose type is the operator’s enclosing type, is implied.
Examples
The following sample generates C2804 and shows how to fix it.
// C2804.cpp // compile by using: cl /c /W4 C2804.cpp class X { public: X& operator+= (const X &left, const X &right); // C2804 X& operator+= (const X &right); // OK - left operand implicitly *this }; int main() { X x, y; x += y; // equivalent to x.operator+=(y) }
The following sample generates C2804 and shows how to fix it.
// C2804_2.cpp // compile with: /clr /c ref struct Y { Y^ operator +(Y^ hY, int i); // C2804 static Y^ operator +(Y^ hY, int i); // OK Y^ operator +(int i); // OK };
Writing my own vector class (for a game engine) and overloading ‘+’ operator in Visual Studio 2013 CPlusPlus project (using VC runtime 120), it is throwing me compiler error:
Error: too many parameters for this operator function.
Code snippet from Vector.hpp
file below.
Vector.hpp
class Vector
{
private:
double i;
double j;
double k;
public:
Vector(double _i, double _j, double _k)
{
i = _i;
j = _j;
k = _k;
}
Vector& operator+=(const Vector& p1)
{
i += p1.i;
j += p1.j;
k += p1.k;
return *this;
}
//Some other functionality...
Vector operator+(const Vector& p1, Vector& p2) //Error is thrown here...
{
Vector temp(p1);
return temp += p2;
}
};
What am I doing wrong here? Don’t want to make my operator overload non-member function.
Garf365
3,6095 gold badges28 silver badges41 bronze badges
asked Mar 11, 2016 at 15:05
2
When operator+
is defined inside class, left operand of operator is current instance. So, to declare a overload of operator+
you have 2 choices
- inside class, with only one parameter which is right operand
- outside of class, with two parameters, left and right operands.
Choice 1: outside class
class Vector
{
private:
double i;
double j;
double k;
public:
Vector(double _i, double _j, double _k)
{
i = _i;
j = _j;
k = _k;
}
Vector& operator+=(const Vector& p1)
{
i += p1.i;
j += p1.j;
k += p1.k;
return *this;
}
//Some other functionality...
};
Vector operator+(const Vector& p1, const Vector& p2)
{
Vector temp(p1);
temp += p2;
return temp;
}
Choice 2: inside class
class Vector
{
private:
double i;
double j;
double k;
public:
Vector(double _i, double _j, double _k)
{
i = _i;
j = _j;
k = _k;
}
Vector& operator+=(const Vector& p1)
{
i += p1.i;
j += p1.j;
k += p1.k;
return *this;
}
Vector operator+(const Vector & p2)
{
Vector temp(*this);
temp += p2;
return temp;
}
};
You can see how should be declared operators here : C/C++ operators
PMF
14.2k3 gold badges23 silver badges47 bronze badges
answered Mar 11, 2016 at 15:12
Garf365Garf365
3,6095 gold badges28 silver badges41 bronze badges
one more possibility is by using the friend keyword.
friend Vector operator+(const Number& n1, const Number& n2)
{
Vector temp(n1);
temp+=n2;
return temp;
}
answered Jan 31, 2018 at 6:41
1
Вероника99 5 / 5 / 5 Регистрация: 16.12.2013 Сообщений: 463 |
||||
1 |
||||
21.11.2016, 22:18. Показов 3016. Ответов 15 Метки нет (Все метки)
Добрый вечер. Нужно в с++ cli сделать перегрузку <<. Подскажите пожалуйста, правильный синтаксис:
0 |
shilko2013 257 / 234 / 185 Регистрация: 02.04.2016 Сообщений: 898 |
||||
21.11.2016, 22:31 |
2 |
|||
0 |
5 / 5 / 5 Регистрация: 16.12.2013 Сообщений: 463 |
|
21.11.2016, 22:40 [ТС] |
3 |
Я так пробовала, в CLI как-то по другому должно быть,т.к там нет &
0 |
805 / 532 / 158 Регистрация: 27.01.2015 Сообщений: 3,017 Записей в блоге: 1 |
|
21.11.2016, 22:40 |
4 |
shilko2013, ошибочка во втором параметре
0 |
Вероника99 5 / 5 / 5 Регистрация: 16.12.2013 Сообщений: 463 |
||||
22.11.2016, 00:10 [ТС] |
5 |
|||
error C3699: &: это косвенное обращение невозможно использовать для типа «const Phone» Добавлено через 1 час 21 минуту
0 |
moskitos80 289 / 95 / 40 Регистрация: 04.10.2011 Сообщений: 329 |
||||||||
22.11.2016, 00:29 |
6 |
|||||||
Вот же вам правильно подсказали:
а у вас:
— найдите отличия.
0 |
Вероника99 5 / 5 / 5 Регистрация: 16.12.2013 Сообщений: 463 |
||||||||
22.11.2016, 00:42 [ТС] |
7 |
|||||||
Я и так,и так пробовала
В файл.срр пишу
Ошибки:
0 |
moskitos80 289 / 95 / 40 Регистрация: 04.10.2011 Сообщений: 329 |
||||||||||||
22.11.2016, 00:59 |
8 |
|||||||||||
Теперь понятно вы пытаетесь поместить перегрузку оператора << прямо в класс Phone — так у вас не выйдет. Я так понял вы хотите выводить Phone в поток ostream. Вам для этого внутри оператора нужны оба операнда, причем левый из них должен быть ostream — при перегрузке оператора, как члена класса — так не получится. Если вы помещаете перегрузку в класс, то автоматом левым операндом становится this и метод будет принимать только один аргумент — правый операнд. Вам нужно перегружать оператор как отдельную функцию: в .h файле после объявления класса Phone:
далее в .cpp файле можно там же где и определения методов Phone:
если внутри определения оператора << нужен доступ к закрытым членам Phone, то объявляйте в объявлении класса Phone в .h файле
надеюсь понятно объяснил
1 |
Вероника99 5 / 5 / 5 Регистрация: 16.12.2013 Сообщений: 463 |
||||||||||||||||
22.11.2016, 01:47 [ТС] |
9 |
|||||||||||||||
Сделала как Вы написали , все равно не работает…
А с << проблемы.
Ошибки Может в C++ CLI вообще невозможно перегрузить этот оператор?
0 |
DrOffset 17457 / 9284 / 2269 Регистрация: 30.01.2014 Сообщений: 16,257 |
||||||||
22.11.2016, 09:07 |
10 |
|||||||
Вот же вам правильно подсказали Неправильно.
Причина ошибки была не в этом.
&: это косвенное обращение невозможно использовать для типа «const Phone» Причина в том, что Phone — это managed класс. И его невозможно использовать со ссылкой (т.к. обычно она реализуется через указатель на низком уровне, а в CLI обычные указатели для managed типов не используются). Поэтому компилятор предлагает для оператора вот такую форму:
Поэтому предлагаю больше не смотреть в сторону перестановки местами амперсанда в параметре функции — это тупиковый вариант. PS. На форуме есть специальный раздел для CLI.
0 |
5 / 5 / 5 Регистрация: 16.12.2013 Сообщений: 463 |
|
22.11.2016, 10:52 [ТС] |
11 |
Cделала так как Вы написали
0 |
17457 / 9284 / 2269 Регистрация: 30.01.2014 Сообщений: 16,257 |
|
22.11.2016, 11:04 |
12 |
Вероника99, покажи место в коде, где возникает ошибка.
0 |
Вероника99 5 / 5 / 5 Регистрация: 16.12.2013 Сообщений: 463 |
||||||||
22.11.2016, 11:08 [ТС] |
13 |
|||||||
Если дописывать friend
.h(27): error C3809: Phone: управляемый тип не может иметь дружественные функции, классы и интерфейсы
0 |
DrOffset 17457 / 9284 / 2269 Регистрация: 30.01.2014 Сообщений: 16,257 |
||||
22.11.2016, 11:12 |
14 |
|||
Вероника99, ну так надо же понимать разницу записи с friend и без…
Phone: управляемый тип не может иметь дружественные функции, классы и интерфейсы Вот эту ошибку сразу надо было показывать
при этом, естественно, доступ в ней будет только к публичным функциям и данным класса.
1 |
5 / 5 / 5 Регистрация: 16.12.2013 Сообщений: 463 |
|
22.11.2016, 11:30 [ТС] |
15 |
Помогло, спасибо, до inline не додумалась бы)
0 |
GbaLog- |
22.11.2016, 12:26
|
Не по теме:
и еще бесконечность Кликните здесь для просмотра всего текста
Бесконечность не предел!
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
22.11.2016, 12:26 |
Error C2678: бинарный «>>»: не найден оператор, принимающий левый операнд типа «std::istream» Error C2678: бинарный «<<«: не найден оператор, принимающий левый операнд типа «std::ifstream»
Шаблоны класса:Матрица. Ошибка бинарный «=»: не найден оператор, принимающий правый операнд типа «Matr<T>» Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 16 |