C++:运算符重载错误:"&"标记之前的预期非限定 id

C++: Operator overloading error: expected unqualified-id before '&' token

本文关键字:id 重载 运算符 错误 C++      更新时间:2023-10-16

错误:

g++ -Wall -Wextra -ansi -pedantic Testr.cc classE.cc classC.cc
classE.cc:46:14: error: expected unqualified-id before '&'token
classC.cc:46:14: error: expected unqualified-id before '&'token

编译器所指的行:

classE classE::&operator%(classB &rhs){

编译器正在讨论"&"在'classE::&运算符"%"表达式;我很想尽快删除"与号",但作业(是任意的家庭作业指南)需要它。我甚至不确定"与"应该做什么。类似的运算符重载方法使用相同的大纲,没有问题,我在谷歌和课本上都是两手空空的。

在参数中指定派生类(classB.h是纯虚拟的)也不能清除这些错误。

因为其他类似定义的运算符工作时没有问题,所以我认为问题在于实现。基本思想是取两个classB派生的对象(classC或classE),并将每个对象包含的字符串变量与另一个对象交错,返回包含交织字符串的lhs类型对象。classE实现实际上与classC实现完全相同:

classC classC::&operator%(classB &rhs){ //Interleave two classB-derived objects, return object of lhs-type
  string temp = rhs.str(), temp2 = restore(), result = "";
  int a = temp.size(), b = temp2.size(), max;
    if (temp2.size() > temp.size()){
      max = temp2;
    }
    else{
      max = temp;
    }
    for (int i = 0; i < max; i++){
      if (i < a){
        result += temp2[i];
      }
      if (i < b){
    result += temp[i];
  }
}
return classC(result);
}

对不起,我是新来的;我不知道如何将行号添加到代码块=-\

感谢您阅读并考虑我的问题。=-)

编辑:我担心这会是一个令人尴尬的愚蠢错误;将行更改为类E&classE::运算符%(classB&rhs){为大量新错误打开了闸门。嘿,就在我以为我掌握了C++的窍门的时候。谢谢大家。我希望我今后所有的问题都一样简单。

classE classE::&operator%(classB &rhs)   

在语法上无效。


如果您正在重载%运算符,您只需要:

classE classE::operator%(classB &rhs)  

如果您打算返回推荐信,您需要:

    classE& classE::operator%(classB &rhs) 
      ^       ^   ^    ^    ^    ^
      |       |   |    |    |    |
      |       |   |    |    |    |
  return type |   |  keyword| function arguments
              |   |         |
       class name |     operator being overloaded 
                  |
              scope resolution operator

您在编写实现时似乎犯了一个错误,因为签名classE classE::&operator%(classB &rhs);不是有效的C++代码。声明类似于classE:中的内容

classE &operator%(classB & rhs);

这将声明operator %的返回类型为classE &。你可能会发现把它写成更清楚

classE& operator%(classB & rhs);

因此,实现实际上应该看起来像

classE & classE::operator%(classB &rhs){