2015-02-24 4 views
0

Не так часто я работаю на C++, и я столкнулся с простой ошибкой, которая удерживает меня.C++ заголовок/файл реализации и перегруженные операторы

В Xcode У меня есть следующие две ошибки: In Event.h: Control reaches end of non-void function In 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; 
} 

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

+0

Вы упускаете разрешения области видимости в вашем определении. – Freddy

ответ

5

Измените заголовок 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); 
}; 

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

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

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

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

+0

Ошибка была удалена из файла заголовка с изменением, однако в файле реализации по-прежнему имеется ошибка. – Matt

+0

Я добавил пространство имен EventComparision, и это решило проблему, но я не понимаю, почему я должен, если метод появляется в файле EventComparison.cpp. Не подразумевается ли пространство имен? Как я могу решить без добавления пространства имен – Matt

+0

'EventComparison' не является пространством имен. Это класс. – mfuchs

2
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; 
} 
Смежные вопросы