Ошибка в объявлении функции пропуск основного текста функции

Цитата
Сообщение от vivatverum
Посмотреть сообщение

почему функцию необходимо объявлять дружественной?

Ее не необходимо объявлять дружественной. Ее необходимо сделать отдельной внешней функцией, а не методом класса.

А уж дружественной ее придется сделать в тех случяах, когда/если вам надо лезть во внутренности класса, которые обычным внешним функциям просто так не доступны. Если вам понадлобится лезть в такие внутренности, то придется объявить ее дружественной. А не понадобится — можно не объявлять. Если вы будуте реализовать вашу функцию, как просто return a*p;, то дружественность вам не нужна.

Также частным побочным эффектом дружественности является возможность запихать определение внешней функции внутрь определения класса. Часто дружественность применяют именно ради этого. Без дружественности это определение функции следует делать снаружи определения класса.

Другими словами, в вашем случае никакой необходимости в дружественности нет. Уберите дружественность, и объявите ваш оператор снуражи класса как inline функцию — все будет работать и так.

Есть вектор с указателями на книги. Надо его отсортировать по дате(по году, потом по месяцу и дню). Еще кстати не знаю, если в векторе указатели, то и в comparator надо ставить * или &?
Питаюсь сделать так

  bool comparator( Book& a, Book& b) {
    if (a.GetYear() < b.GetYear()) return true;
    if (a.GetYear() > b.GetYear()) return false;
    if (a.GetMonth() < b.GetMonth()) return true;
    if (a.GetMonth() > b.GetMonth()) return false;
    return a.GetDay() < b.GetDay();
}
sort(books.begin(), books.end(), comparator)

Выдает такие ошибки

error C3867: "HeroFunctions::comp": нестандартный синтаксис; используйте "&", чтобы создать указатель на член
error C2672: "sort": не найдена соответствующая перегруженная функция
error C2780: void std::sort(const _RanIt,const _RanIt): требует аргументов: 2, имеется: 3

Пытался сделать с перегрузкой

bool operator<(Book* book1, Book* book2)
    {
        if (book1->GetYear() == book2->GetYear())
        {
            if (book1->GetMonth() == book2->GetMonth())
                return book1->GetDay() < book2->GetDay();
 
            return book1->GetMonth() < book2->GetMonth();
        }
        return book1->GetYear() < book2->GetYear();
    }
    sort(books.begin(), books.end())

Выдает это

error C2804: бинарный "operator <" имеет слишком много параметров
error C2333: HeroFunctions<T,U>::operator <: ошибка в объявлении функции; пропуск основного текста 
  функции
error C2333: HeroFunctions<std::string,Hero>::operator <: ошибка в объявлении функции; пропуск 
 основного текста функции

Вот тут проект. Думаю будет проще, если запустите и там увидете ошибку и сможете исправить

There’s a vector with book signs. We’ll have to sort it out by day. Also, I don’t know if the vector’s indicator, you’re gonna have to put it in the comparator or something.
I’m trying to do that.

  bool comparator( Book& a, Book& b) {
    if (a.GetYear() < b.GetYear()) return true;
    if (a.GetYear() > b.GetYear()) return false;
    if (a.GetMonth() < b.GetMonth()) return true;
    if (a.GetMonth() > b.GetMonth()) return false;
    return a.GetDay() < b.GetDay();
}
sort(books.begin(), books.end(), comparator)

Makes such mistakes.

error C3867: "HeroFunctions::comp": нестандартный синтаксис; используйте "&", чтобы создать указатель на член
error C2672: "sort": не найдена соответствующая перегруженная функция
error C2780: void std::sort(const _RanIt,const _RanIt): требует аргументов: 2, имеется: 3

Trying to overload.

bool operator<(Book* book1, Book* book2)
    {
        if (book1->GetYear() == book2->GetYear())
        {
            if (book1->GetMonth() == book2->GetMonth())
                return book1->GetDay() < book2->GetDay();
        return book1-&gt;GetMonth() &lt; book2-&gt;GetMonth();
    }
    return book1-&gt;GetYear() &lt; book2-&gt;GetYear();
}
sort(books.begin(), books.end())

Gives it up.

error C2804: бинарный "operator <" имеет слишком много параметров
error C2333: HeroFunctions<T,U>::operator <: ошибка в объявлении функции; пропуск основного текста
функции
error C2333: HeroFunctions<std::string,Hero>::operator <: ошибка в объявлении функции; пропуск
основного текста функции

https://github.com/LavrovSergey/test

Перегрузка функции ==

В настоящее время я работаю над созданием перегруженной функции для оператора ==. Я создаю файл hpp для связанного списка, и я не могу заставить этот оператор работать в файле hpp.

В настоящее время у меня есть это:

template <typename T_>
class sq_list 
{

bool operator == ( sq_list & lhs, sq_list & rhs) 
{
    return *lhs == *rhs;
};

reference operator * ()     {
        return _c;
    };

};
}

Я получаю около 10 ошибок, но они в значительной степени повторяются как ошибки:

C2804: двоичный ‘operator ==’ имеет слишком много параметров
C2333: ‘sq_list:: operator ==’: ошибка в объявлении функции; пропуск функции тела
C2143: синтаксическая ошибка: отсутствует ‘;’ до ‘*’
C4430: отсутствующий спецификатор типа — int. Примечание: С++ не поддерживает default-int

Я попытался изменить ситуацию, но я постоянно получаю те же ошибки, что и выше

Любые советы или помощь по этому поводу приветствуются.

18 фев. 2012, в 02:15

Поделиться

Источник

У оператора-члена только один аргумент, который является другим объектом. Первым объектом является сам экземпляр:

template <typename T_>
class sq_list 
{
    bool operator == (sq_list & rhs) const // don't forget "const"!!
    {
        return *this == *rhs;  // doesn't actually work!
    }
};

Это определение на самом деле не имеет смысла, поскольку оно просто называет себя рекурсивно. Вместо этого он должен вызывать некоторую операцию члена, например return this->impl == rhs.impl;.

Kerrek SB
18 фев. 2012, в 02:12

Поделиться

http://courses.cms.caltech.edu/cs11/material/cpp/donnie/cpp-ops.html

Операторы сравнения очень просты. Сначала определите ==, используя сигнатуру функции следующим образом:

  bool MyClass::operator==(const MyClass &other) const {
    ...  // Compare the values, and return a bool result.
  }

КАК сравнить объекты MyClass — все ваши собственные.

Tim Kachko
18 фев. 2012, в 02:16

Поделиться

Вы объявляете перегрузку == как часть определения класса, поскольку экземпляры метода получат. Таким образом, первый параметр, который вы запрашиваете, lhs, уже неявно: помните, в рамках методов экземпляра вы имеете доступ к this.

class myClass {
    bool operator== (myClass& other) {
        // Returns whether this equals other
    }
}

Метод operator ==() как часть класса следует понимать как «этот объект знает, как сравнивать себя с другими».

Вы можете перегрузить operator ==() вне класса, чтобы получить два аргумента, причем оба объекта сравниваются, если это имеет для вас больше смысла. Глянь сюда:
http://www.learncpp.com/cpp-tutorial/94-overloading-the-comparison-operators/

slezica
18 фев. 2012, в 01:55

Поделиться

Ещё вопросы

  • 1событие android onClick не запускается
  • 0Выбрав объект с помощью jQuery после функции изменения, изменил html-структуру элемента, который нужно было выбрать
  • 1Среднечасовые данные данных CSV
  • 0Angularjs сбрасывает радиовход, если щелкнуть два раза подряд
  • 1Java — фальшивые мышиные события без окна фокусировки
  • 0в то время как удалить / обновить значение структуры в векторе, получая ошибку компиляции?
  • 0php @ Azure Веб-сайт: не могу написать в% TMP%
  • 0При использовании Fancybox горизонтальная полоса прокрутки сайта сбрасывается.
  • 1Как рассчитывать по строкам, основанным на значении кадра данных панд?
  • 0Как настроить все модули отключить только модуль викторины включен в Moodle?
  • 1Как скопировать файл из папки в другую папку с помощью Windows Service C #
  • 1Как правильно реализовать обработку кадров Camera2 в реальном времени с помощью RxJava?
  • 0Mvc; Вернуть загружаемый файл в представление
  • 0Ответ на запрос mysqli остается пустым, несмотря на соединение с базой данных
  • 1NoClassDefFoundError для класса в пакете приложения
  • 1Возвратите название листовки geoJSON с помощью щелчка
  • 0Как вычесть количество моих продуктов, перечисленных в списке, непосредственно в мою базу данных продуктов? (Баз данных)
  • 1Как мой usercript может работать до запуска inline-javascript?
  • 1Поиск строк в списке с помощью Loop Return Order
  • 1Python: присвоение переменной с использованием «или» с лямбда-функциями? [Дубликат]
  • 1PyQt: множественный QProcess и вывод
  • 1Как я могу изменить размер иконки на tabItem?
  • 1отключить сортируемую функцию mootools без редактирования оригинала
  • 0стиль шоу отличается в Chrome и Firefox Safari и iPhone
  • 0Struture «Студент» C ++
  • 0Поведение CodeIgniter, конструкторы и маршруты
  • 0Найти любой элемент формы
  • 1Попробуйте и поймать блоки: будь то в самом классе или когда я вызываю метод вне класса
  • 1Перенос данных из файла Python в другой
  • 0как сделать пользовательскую директиву в угловых для расчета расстояния с помощью карт Google
  • 1Наблюдаемый список Приведение / Конверсия
  • 1JS вызвать конструктор базового класса
  • 0случайная работа cron
  • 0Базовый проект cloud9
  • 1Как получить конкретное имя поля XML-файла в JAVA?
  • 0очистка setInterval в плагине onScreen для изменения класса в окне просмотра
  • 0Проблема с функцией jQuery .click
  • 0Ссылки работают в браузере, но не работают в iPad
  • 0Переключатель с диапазоном значений
  • 0Сложный SQL-запрос с переменными
  • 1Подождите, пока страница полностью загрузится с webdriverjs
  • 0почему мой ajax minifier не объединяет файл javascript
  • 1Как добавить новый столбец в строку, содержащую определенное значение?
  • 1Python3: удалить подстроку между двумя символами-разделителями
  • 0действие, если все классы имеют определенный статус
  • 1Понимание «побочных эффектов» в Javascript с учетом функций первого класса
  • 0Разбор HTTP POST в PHP с использованием REGEX?
  • 0Как построить точку по указателю в одну строку?
  • 0Как независимые разработчики ПО скрывают свой объектный код, когда вы можете декомпилировать?
  • 1pytest не может обработать Unicode в doctest в README под Python 2.7

Сообщество Overcoder

Кажется, ошибка возникает в первом операторе if. Кажется, я не понимаю, почему это происходит. If не находится в глобальном пространстве имен, так как поиск в Google привел меня к проверке.

Я прошу прощения, если я не публикую правильно, но это мой первый пост.

Заранее спасибо. Это, наверное, глупо просто, но я сейчас учусь.

#ifndef moveHare
#define moveHare

//Create new class for Hare movement roll
class moveHare
{
//Initialize variables to be used
    int hareMovement = 0;
    int hareRoll = rand() % 100 + 1;

private:
//if statements to compare the random int to the movement int 
//Error happens at first if statement.`enter code here`
    if (hareRoll > 50) {
        hareMovement = hareMovement + 3;
    }

    else if (hareRoll > 50 && hareRoll < 71) {
        hareMovement = hareMovement + 6;
    }
};

#endif

2 ответа

Лучший ответ

Я создавал новый класс в заголовочном файле вместо объявления функции. Этот код исправлен, но не закончен.

Спасибо Джорджу и Бауму за то, что они показали мне очевидное умелому набору глаз!

#pragma once

#ifndef movement
#define movement





int moveHare() {

        int hareMovement = 0;
        int hareRoll = rand() % 100 + 1;

        if (hareRoll > 50) {
            hareMovement = hareMovement + 3;
        }

        else if (hareRoll > 50 && hareRoll < 71) {
            hareMovement = hareMovement + 6;
    }
        return hareMovement;
}


#endif


0

Garrett Holland
19 Фев 2017 в 23:04

Я заметил, что вы решили проблему, но я просто хотел предложить альтернативное решение. Если вы хотите сохранить класс, который вы объявили в своем вопросе, то вы можете сделать следующее, чтобы исправить код:

 #ifndef moveHare
 #define moveHare

 //Create new class for Hare movement roll
 class MoveHare
 {
     private:
         int hareMovement = 0;
         int hareRoll = rand() % 100 + 1;

     public:
         int MoveTheHare(void);
 };

 #endif

Затем вы можете определить свою функцию следующим образом:

int MoveHare::MoveTheHare(void)
{
    if (hareRoll > 50)
    {
        hareMovement = hareMovement + 3;
    }

    else if (hareRoll > 50 && hareRoll < 71)
    {
        hareMovement = hareMovement + 6;
    }

    return hareMovement;
}

Я просто хотел принять этот вопрос как возможность опубликовать этот метод, хотя он был опубликован ранее. Надеюсь это поможет!

Кстати, если я что-то не так сделал в своем коде или в своем посте, сообщите мне об этом в поле для комментариев.


0

BusyProgrammer
25 Фев 2017 в 15:23

Понравилась статья? Поделить с друзьями:
  • Ошибка в организации труда детей это
  • Ошибка в определении пола на 20 неделе отзывы 2020
  • Ошибка в объекте уголовное право это
  • Ошибка в организации отсутствует руководитель организации
  • Ошибка в определении мирового суда