Loading...
MilushT avatar MilushT 1 Точки

Judge Assignment 05 - Task 5 - Sorting Compile error

Жоро,

Може ли да погледнеш защо ми дава compilation error на judge. Дали не качвам правилните файлове или има нещо друго. Пробвах какво ли не и не става, а на Vision Studio (настроено за /std:c++14) си се компилира и работи.

Тагове:
0
C++ Programming 08/10/2018 06:26:03
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки
Best Answer

Здравей,

Прегледах ти кода, но дори да работи за някои примери, това все още не е правилното решение. Дефинираш много излишни неща, които изобщо не използваш.

Компилационната грешка идва, защото вътре в един клас, който има template T, дефинираш друг template T и го "скрива" (отвори и компилирай .cpp файла с Code::Blocks и ще видиш грешката, не знам защо Visual Studio я игнорира - като цяло ако не ти се компилира нещо в judge системата, пробвай да компилираш с Code::Blocks и най-вероятно ще видиш грешката). Изобщо този Comparator клас който дефинираш е излишен. Най-вероятно си го направил, защото ти е дало грешка за Comparator<T> less, който дефинираш по-долу (но не ползваш никъде). Това е на верен път - този less трябва да го ползваш в operator() за да вземеш резултата му за двата параметъра и да го обърнеш наобратно. Но го декларираш грешно. Comparator е template, което означава, че буквално се заменя с кода, който е подаден от отвън. От отвън се подава LessThan<Song> примерно, което означава, че текста Comparator се заменя с текста LessThan<Song>. Ти като напишеш Comparator<T> less; се получава LessThan<Song><Song> less; тоест повтаряш template-а.

Просто го остави Comparator less; - това ще се замени с LessThan<Song> less; ако бъде повикано за Song и LessThan, както в третия случай в main файла.

И не забравяй на този less да му викаш operator() в overload-а за operator() на Reverse - НЕ трябва да правиш обратното на знак < (това правиш в момента в Reverse) - това е напълно грешно, защото предполагаш, че двата обекта се сравняват с оператор <, което не е вярно - сравняват се с Comparator, което може да бъде LessThan, което ползва operator<, ама може да е и какъвто и да е друг клас който има operator(), който ти не знаеш какво точно прави. Не трябва да предполагаш какво прави Comparator, трябва просто да му извикаш operator() и той ще ти каже каква е подредбата на двата параметъра.

И също така в LessThan ползваш operator>, вместо да ползваш operator<, което означава, че редът ще ти излезе наобратно. Сигурно пак си се опитвал да компенсираш за нещо друго, но правилното поведение на LessThan е да ползва operator<.

Направи тези корекции, махни всичките излишни декларации и typedef-ове (не ги ползваш за нищо) и ще ти се компилира и работи правилно.

На упражненията днес ще решаваме подобни задачи, така че ще имаш време да си прегледаш нещата до утре вечерта ако този отговор не те ориентира напълно.

Поздрави,

Жоро

0
MilushT avatar MilushT 1 Точки

Здравей,

Много благодаря за подробния отговор. Не очаквах подобно нещо от Visual Studios и ще си имам едно на ум от тук нататък - изобщо нямаше да се сетя. Що се отнася до това, че когато вътре в един клас, който има template T, дефинираш друг template T и го "скрива" - не знам какво точно значи това и защо се получава проблем, ако има време да го обясниш на упражненията ще е супер. Аз просто се опитвах да дам някаква дефиниция на Comparator ама явно не е станало точно така. Tъй или иначе като го махнах компилационната грешка се оправи, а нямаше никаква разлика за работата на кода - явно е бил съвсем излишен.

Иначе съм съвсем наясно, че Comparator не върши никаква работа(т.е. изобщо не се използва LessThan), а само лъже main-a. То като не можах да измисля начин да подавам LessThan на Reversе поне да се компилира...През цялото време се водех от това, че main-a слага  int, string и Song в set. A на set-a може да се подаде втори параметър greater, който да сортира set в обратен ред. Т.е. идеята ми беше да имитирам greater в дефиницията на Reverse и поради тази причина все не можех да намеря приложeние на LessThan. greater си работи без проблеми с int и string, a Song имаше overload-нат оператор <, на който само трябваше да се даде !.  Това, че ! проработи си беше чиста изненада за мен- аз по-скоро си мислех за специализация за Song. Надявам се, че след като приключи contest-a в judge ще може да се погледне някакъв код - ще ми е изключително интересно да видя тази част. 

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.