Не часто я работаю на C ++ и сталкиваюсь с простой ошибкой, которая меня сдерживает.

В Xcode у меня есть две ошибки: В Event.h: Control reaches end of non-void function В Event.cpp: Overloaded operator must have at least one argument of class or enumeration

Обе ошибки находятся в строках сигнатуры метода для

bool operator () (Event *left, Event *right)

Вот файлы .h и .cpp целиком (пока не так много): Event.h

#ifndef __EventSimulation__EventComparison__
#define __EventSimulation__EventComparison__

#include <iostream>
#include "Event.h"
class EventComparison {
public:
    bool operator () (Event *left, Event *right){}

};
#endif

Event.cpp

#include "EventComparison.h"
#include "Event.h"

bool operator() (Event *left, Event *right) {
    return left->time > right->time;
}

Может ли кто-нибудь помочь мне исправить эту ошибку и объяснить, что / почему выдает ошибку компиляции и как избежать этого в функции. Спасибо за вашу помощь!

1
Matt 24 Фев 2015 в 22:53

2 ответа

Лучший ответ

Измените заголовок Event.h на

class EventComparison {
public:
    // the {} is the body of the function, therefore
    // you added a function defintion, though you did
    // not return a result
    // bool operator () (Event *left, Event *right){}

    // this is a function declaration:
    // the body of the function is not defined
    bool operator () (Event *left, Event *right);
};

В заголовке вы фактически определили функцию, добавив круглые скобки.

Затем в исходном файле сделайте

bool EventComparison::operator() (Event *left, Event *right) {
     return left->time > right->time;
}

Вы определили bool operator в глобальном пространстве имен, но вы хотели определить функцию-член. Для этого вам необходимо указать, к какому классу принадлежит функция, что вы можете сделать с помощью части EventComparison::.

6
mfuchs 24 Фев 2015 в 20:02
bool operator () (Event *left, Event *right){}

определяет функцию-член, которая ничего не делает. Такая функция должна иметь возвращаемый тип void, поскольку она ничего не возвращает.

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

Короче, вам нужно:

// Declaration
class EventComparison {
  public:
    // NOTE: const
    bool operator () const (Event *left, Event *right);
};

// Implementation
bool EventComparison::operator() const (Event *left, Event *right) {
      return left->time > right->time;
}
2
rici 24 Фев 2015 в 20:06