C ++: ошибка перегрузки оператора: ожидание неквалифицированного идентификатора перед маркером '&' - PullRequest
0 голосов
/ 18 марта 2012

Ошибка:

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 :: & operator%'выражение;Я бы сразу же удалил амперсанд, но назначение (да, произвольные рекомендации по выполнению домашних заданий) требует этого.Я даже не уверен, что должен делать амперсанд.Подобные методы перегрузки операторов используют ту же схему без проблем, и я пришел с пустыми руками через google и учебники.

Указание производного класса (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);
}

Извините, я новичок здесь;Я понятия не имею, как добавить номера строк в блоки кода = - \

Спасибо за чтение и рассмотрение моей проблемы.= -)

РЕДАКТИРОВАТЬ: я боялся, что это будет смущающей глупой ошибкой;изменение строки на classE & classE :: operator% (classB & rhs) {открыло шлюзы для множества новых ошибок.Хех, как раз тогда, когда я думал, что знакомлюсь с C ++.Большое спасибо, ребята.Я надеюсь, что все мои будущие вопросы так же просты.

Ответы [ 2 ]

2 голосов
/ 18 марта 2012
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
0 голосов
/ 18 марта 2012

Вы, похоже, допустили ошибку при написании реализации, поскольку подпись classE classE::&operator%(classB &rhs); не является допустимым кодом C ++. Объявление выглядит примерно так в classE:

classE &operator%(classB & rhs);

Это объявляет, что operator % имеет тип возврата classE &. Возможно, вам будет проще написать это как

classE& operator%(classB & rhs);

Таким образом, реализация должна выглядеть примерно так:

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