C++;头文件/实现文件和重载运算符 我经常在C++中工作,我遇到了一个简单的错误,它让我很忙。

C++;头文件/实现文件和重载运算符 我经常在C++中工作,我遇到了一个简单的错误,它让我很忙。,c++,operator-overloading,header-files,C++,Operator Overloading,Header Files,在Xcode中,我有以下两个错误: 在事件.h:控件到达非无效函数的末尾 在Event.cpp中:重载运算符必须至少有一个类或枚举参数 这两个错误都在签名的方法行中 bool operator () (Event *left, Event *right) 下面是完整的.h和.cpp文件(目前还没有太多): 事件h 请有人帮我修复这个错误,并解释什么/为什么会出现编译错误,以及如何在功能中避免这个错误。谢谢你的帮助 将标题事件.h更改为 class EventComparison { publi

在Xcode中,我有以下两个错误: 在事件.h:
控件到达非无效函数的末尾
在Event.cpp中:
重载运算符必须至少有一个类或枚举参数

这两个错误都在签名的方法行中

bool operator () (Event *left, Event *right)
下面是完整的.h和.cpp文件(目前还没有太多): 事件h


请有人帮我修复这个错误,并解释什么/为什么会出现编译错误,以及如何在功能中避免这个错误。谢谢你的帮助

将标题事件.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运算符,但您要做的是定义一个成员函数。

要实现这一点,您必须指定函数所属的类,您可以通过
事件比较::
部分执行此操作。

将header 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 operator () (Event *left, Event *right){}
您在标题中所做的实际上是通过添加括号来定义函数

那么在源文件中呢

bool EventComparison::operator() (Event *left, Event *right) {
     return left->time > right->time;
}
您在全局命名空间中定义了一个
bool运算符,但您要做的是定义一个成员函数。
要做到这一点,您必须指定该函数属于哪个类,您可以通过
EventComparison::
部分来完成

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;
}
定义不执行任何操作的成员函数。这样的函数必须具有返回类型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;
}

您缺少定义中的范围解析。您缺少定义中的范围解析。此错误已随更改从头文件中删除,但是,实现文件仍然存在此错误。我添加了EventComparison的命名空间,这解决了此问题,但是我不明白如果EventComparison.cpp文件中出现了该方法,为什么我必须这样做。名称空间不是隐含的吗?如何在不添加命名空间的情况下解析
EventComparison
不是命名空间。这是课堂。谢谢你的澄清。是否可以将类名从单个方法中移出,以便它应用于EventComparison.cpp中的所有方法而不会出现重复错误?您的意思是要避免在Event.cpp中不断写入
EventComparison
?不,那是不可能的。您可以在标题中内联定义函数。有关内联的更多信息,请参见示例和。此错误已随更改从头文件中删除,但是,实现文件仍然存在此错误。我添加了EventComparison的命名空间,这解决了问题,但我不明白如果该方法出现在EventComparison.cpp文件中,为什么必须这样做。名称空间不是隐含的吗?如何在不添加命名空间的情况下解析
EventComparison
不是命名空间。这是课堂。谢谢你的澄清。是否可以将类名从单个方法中移出,以便它应用于EventComparison.cpp中的所有方法而不会出现重复错误?您的意思是要避免在Event.cpp中不断写入
EventComparison
?不,那是不可能的。您可以在标题中内联定义函数。有关内联的更多信息,请参见示例和。