Ошибка c2804 бинарный operator имеет слишком много параметров

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.

Lightness Races in Orbit's user avatar

asked Apr 3, 2013 at 2:37

varrick's user avatar

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

taocp's user avatar

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.

Lightness Races in Orbit's user avatar

asked Apr 3, 2013 at 2:37

varrick's user avatar

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

taocp's user avatar

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;
    }
};

enter image description here

What am I doing wrong here? Don’t want to make my operator overload non-member function.

Garf365's user avatar

Garf365

3,6095 gold badges28 silver badges41 bronze badges

asked Mar 11, 2016 at 15:05

A.B.'s user avatar

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's user avatar

PMF

14.2k3 gold badges23 silver badges47 bronze badges

answered Mar 11, 2016 at 15:12

Garf365's user avatar

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

Srinivasa Lakkaraju's user avatar

1

Вероника99

5 / 5 / 5

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

Сообщений: 463

1

21.11.2016, 22:18. Показов 3016. Ответов 15

Метки нет (Все метки)


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

Добрый вечер. Нужно в с++ cli сделать перегрузку <<. Подскажите пожалуйста, правильный синтаксис:
Попытки угадать синтаксис:

C++
1
2
3
4
5
    bool operator <<();
     void operator<<( const Phone^);
 void operator<<( const Phone^, const Phone^);
     void operator<<( const Phone^,int);
и еще бесконечность



0



shilko2013

257 / 234 / 185

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

Сообщений: 898

21.11.2016, 22:31

2

C++
1
ostream & operator<<(ostream & os, const & Phone);



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

C++
1
ostream & operator<<(ostream & os, const Phone&);

error C3699: &: это косвенное обращение невозможно использовать для типа «const Phone»
для продолжения работы компилятор заменил «&» на «^»
error C2804: бинарный «operator <<» имеет слишком много параметров
Phone.cpp
error C3699: &: это косвенное обращение невозможно использовать для типа «const Phone»
для продолжения работы компилятор заменил «&» на «^»
error C2804: бинарный «operator <<» имеет слишком много параметров
Phone.cpp(55): error C3699: &: это косвенное обращение невозможно использовать для типа «const Phone»
для продолжения работы компилятор заменил «&» на «^»
Phone.cpp(55): error C2761: std::ostream &Phone::operator <<(std::ostream &,const Phone ^): повторное объявление функции не разрешается
Phone.cpp(56): error C2447: {: отсутствует заголовок функции (возможно, используется формальный список старого типа)

Добавлено через 1 час 21 минуту
Не подскажете?



0



moskitos80

289 / 95 / 40

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

Сообщений: 329

22.11.2016, 00:29

6

Вот же вам правильно подсказали:

C++
1
ostream & operator<<(ostream & os, const & Phone);

а у вас:

C++
1
ostream & operator<<(ostream & os, const Phone&);

— найдите отличия.



0



Вероника99

5 / 5 / 5

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

Сообщений: 463

22.11.2016, 00:42

 [ТС]

7

Я и так,и так пробовала
В файл.h пишу

C++
1
ostream & operator<<(ostream & , const &);

В файл.срр пишу

C++
1
2
3
4
ostream & Phone::operator<<(ostream & os, const  &Phone);
{
    return os;
}

Ошибки:
Phone.h(27): error C4430: отсутствует спецификатор типа — предполагается int. Примечание. C++ не поддерживает int по умолчанию
Phone.h(27): error C2804: бинарный «operator <<» имеет слишком много параметров
Phone.cpp
Phone.h(27): error C4430: отсутствует спецификатор типа — предполагается int. Примечание. C++ не поддерживает int по умолчанию
Phone.h(27): error C2804: бинарный «operator <<» имеет слишком много параметров
Phone.cpp(55): error C4430: отсутствует спецификатор типа — предполагается int. Примечание. C++ не поддерживает int по умолчанию
Phone.cpp(55): error C2761: std::ostream &Phone::operator <<(std::ostream &,const int &): повторное объявление функции не разрешается
Phone.cpp(56): error C2447: {: отсутствует заголовок функции (возможно, используется формальный список старого типа)



0



moskitos80

289 / 95 / 40

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

Сообщений: 329

22.11.2016, 00:59

8

Теперь понятно вы пытаетесь поместить перегрузку оператора << прямо в класс Phone — так у вас не выйдет. Я так понял вы хотите выводить Phone в поток ostream. Вам для этого внутри оператора нужны оба операнда, причем левый из них должен быть ostream — при перегрузке оператора, как члена класса — так не получится. Если вы помещаете перегрузку в класс, то автоматом левым операндом становится this и метод будет принимать только один аргумент — правый операнд. Вам нужно перегружать оператор как отдельную функцию:

в .h файле после объявления класса Phone:

C++
1
ostream & operator<<(ostream &, const & Phone);

далее в .cpp файле можно там же где и определения методов Phone:

C++
1
2
3
4
5
ostream & operator<<(ostream & os, const & Phone p) 
{
    os << p.method() // какие то методы ...
    return os;
}

если внутри определения оператора << нужен доступ к закрытым членам Phone, то объявляйте в объявлении класса Phone в .h файле

C++
1
friend ostream & operator<<(ostream &, const & Phone);

надеюсь понятно объяснил



1



Вероника99

5 / 5 / 5

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

Сообщений: 463

22.11.2016, 01:47

 [ТС]

9

Сделала как Вы написали , все равно не работает…
Оператор >> перегрузила нормально:

C++
1
 array<Phone^> ^ operator>>(int);
C++
1
2
array<Phone^> ^Phone::operator>>(int)
{...}

А с << проблемы.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
ref class Phone: BaseClass
{ 
public:
    
    String^s;
    
    friend ostream & operator<<(ostream &, const & Phone);
 
//  bool operator <<();
     //void operator<<( const Phone^);
 
 
};
C++
1
2
3
4
5
ostream & operator<<(ostream & os, const & Phone p) 
{
   // os << p.method() // какие то методы ...
    return os;
}

Ошибки
Phone.h(27): error C4430: отсутствует спецификатор типа — предполагается int. Примечание. C++ не поддерживает int по умолчанию
: error C3809: Phone: управляемый тип не может иметь дружественные функции, классы и интерфейсы
Phone.cpp
error C4430: отсутствует спецификатор типа — предполагается int. Примечание. C++ не поддерживает int по умолчанию
error C3809: Phone: управляемый тип не может иметь дружественные функции, классы и интерфейсы
Phone.cpp(54): error C4430: отсутствует спецификатор типа — предполагается int. Примечание. C++ не поддерживает int по умолчанию
Phone.cpp(54): error C2146: синтаксическая ошибка: отсутствие «,» перед идентификатором «p»

Может в C++ CLI вообще невозможно перегрузить этот оператор?



0



DrOffset

17457 / 9284 / 2269

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

Сообщений: 16,257

22.11.2016, 09:07

10

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

Вот же вам правильно подсказали

Неправильно.
У нее было правильно:

Цитата
Сообщение от Вероника99
Посмотреть сообщение

C++
1
ostream & operator<<(ostream & os, const Phone&);

Причина ошибки была не в этом.
Компилятор пишет:

Цитата
Сообщение от Вероника99
Посмотреть сообщение

&: это косвенное обращение невозможно использовать для типа «const Phone»

Причина в том, что Phone — это managed класс. И его невозможно использовать со ссылкой (т.к. обычно она реализуется через указатель на низком уровне, а в CLI обычные указатели для managed типов не используются). Поэтому компилятор предлагает для оператора вот такую форму:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
ref class Phone: BaseClass
{ 
public:
    String ^ s;
    
    friend ostream & operator<<(ostream &, const Phone ^);
};
 
ostream & operator<<(ostream & os, const Phone ^ p) 
{
    os << p->method(); // какие то методы ...
    return os;
}

Поэтому предлагаю больше не смотреть в сторону перестановки местами амперсанда в параметре функции — это тупиковый вариант.
Скорейшим образом нужно отучаться от работы с инструментарием в стиле: «компилятор показал ошибку, читать я ее, конечно же, не буду, лучше совершу-ка я какие-то случайные действия — авось поможет.»

PS. На форуме есть специальный раздел для CLI.



0



5 / 5 / 5

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

Сообщений: 463

22.11.2016, 10:52

 [ТС]

11

Cделала так как Вы написали
.h(27): error C2804: бинарный «operator <<» имеет слишком много параметров
Phone.cpp
.h(27): error C2804: бинарный «operator <<» имеет слишком много параметров



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

C++
1
2
3
4
5
6
7
8
ref class Phone: Device
{ 
public:
    ...
     [B]ostream & operator<<(ostream &, const Phone^);[/B]
 
 
};

Если дописывать friend

C++
1
friend ostream & operator<<(ostream &, const Phone^);

.h(27): error C3809: Phone: управляемый тип не может иметь дружественные функции, классы и интерфейсы
Phone.cpp
.h(27): error C3809: Phone: управляемый тип не может иметь дружественные функции, классы и интерфейсы



0



DrOffset

17457 / 9284 / 2269

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

Сообщений: 16,257

22.11.2016, 11:12

14

Вероника99, ну так надо же понимать разницу записи с friend и без…
Исправляя одну ошибку, сажаешь еще несколько новых

Цитата
Сообщение от Вероника99
Посмотреть сообщение

Phone: управляемый тип не может иметь дружественные функции, классы и интерфейсы

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

C++
1
2
3
4
5
inline ostream & operator<<(ostream & os, const Phone ^ p) 
{
    os << p->method(); // какие то методы ...
    return os;
}

при этом, естественно, доступ в ней будет только к публичным функциям и данным класса.



1



5 / 5 / 5

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

Сообщений: 463

22.11.2016, 11:30

 [ТС]

15

Помогло, спасибо, до inline не додумалась бы)



0



GbaLog-

22.11.2016, 12:26


    бинарный «operator <<» имеет слишком мало параметров С++

Не по теме:

Цитата
Сообщение от Вероника99
Посмотреть сообщение

и еще бесконечность

Кликните здесь для просмотра всего текста

Бесконечность не предел! :D

бинарный "operator <<" имеет слишком мало параметров С++



0



IT_Exp

Эксперт

87844 / 49110 / 22898

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

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

22.11.2016, 12:26

Error C2678: бинарный «>>»: не найден оператор, принимающий левый операнд типа «std::istream»
Вот ошибка
1&gt;—— Построение начато: проект: ыпошряоям, Конфигурация: Debug Win32 ——
1&gt; …

Error C2678: бинарный «<<«: не найден оператор, принимающий левый операнд типа «std::ifstream»
Собственно, текст ошибки приведен в названии темы. Сам код:
#include &quot;stdafx.h&quot;
#include…

Бинарный «>>»: не найден оператор, принимающий левый операнд типа «std::istream»
Подскажите, пожалуйста, как решить проблему. Хочу перегрузить оператор ввода, но никак не пойму, в…

Шаблоны класса:Матрица. Ошибка бинарный «=»: не найден оператор, принимающий правый операнд типа «Matr<T>»
Выдает ошибку &quot;бинарный &quot;=&quot;: не найден оператор, принимающий правый операнд типа &quot;Matr&lt;T&gt;&quot; (или…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

16

  • Ошибка c28 suzuki gsxr 600
  • Ошибка c2731 winmain функция не может быть перегружена
  • Ошибка c2730 kyocera 3051ci
  • Ошибка c2679 бинарный не найден оператор принимающий правый операнд типа
  • Ошибка c2589 недопустимая лексема справа от