Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
#1

Определение чистой виртуальной функции класса-шаблона - C++

15.07.2014, 03:56. Просмотров 388. Ответов 5
Метки нет (Все метки)

Есть класс Comparable<T>:
C++
1
2
3
4
5
6
7
8
9
10
11
12
template<typename T>
class Comparable : virtual public Object {
public:
    virtual int compareTo(const T other) const = 0;
 
    virtual bool operator< (const T other) const final { return compareTo(other) <  0; }
    virtual bool operator> (const T other) const final { return compareTo(other) >  0; }
    virtual bool operator<=(const T other) const final { return compareTo(other) <= 0; }
    virtual bool operator>=(const T other) const final { return compareTo(other) >= 0; }
    virtual bool operator==(const T other) const final { return compareTo(other) == 0; }
    virtual bool operator!=(const T other) const final { return compareTo(other) != 0; }
};
И есть класс Time, который должен реализовать сравнения как и другими Time, так и с строками (char*):
C++
1
2
3
4
5
6
class Time, public Comparable<Time>, public Comparable<char*> {
    /**/
    virtual int compareTo(const Time other) const { /**/ }
    virtual int compareTo(const char* other) const { /**/ }
    /**/
};
Но компилятор ругается, что я не реализовал метод compareTo(const char* other), хотя это не так.
Кстати, за compareTo(const Time other) ничего не говорит, значит все нормально.
И в чем ошибка?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2014, 03:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Определение чистой виртуальной функции класса-шаблона (C++):

Определение функции за пределами шаблона класса - C++
не могу определить функцию за пределами класса, не компилится подсобите советом template&lt; typename TData &gt; class Owner { ...

Определение метода-шаблона за пределами шаблона класса - C++
День добрый! Разбираюсь в шаблонах, решил копнуть поглубже. Вот пример: template &lt;typename T1&gt; class K // шаблон класса { public:...

Можно ли разбивать определение шаблона класса на несколько файлов? - C++
Можно ли написать в хедере определение класса с прототипами методов, а реализацию методов в отдельном файле?

Перекрытие виртуальной функции базового класса - C++
Возникла проблема с перекрытием виртуальной функции базового класса. Изначально все было всё в 1 классе: class S { ... private: ...

Создайте базовый абстрактный класс «Товар» с чистой виртуальной функцией вывода данных - C++
Создайте базовый абстрактный класс «Товар» с чистой виртуальной функцией вывода данных. В этом классе должны быть элементы данных,...

Не работает вызов виртуальной функции из класса потомка - C++
Есть код: #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;list&gt; #include &lt;algorithm&gt; #include &lt;string&gt; #include &lt;sstream&gt; ...

5
0x10
2465 / 1637 / 239
Регистрация: 24.11.2012
Сообщений: 4,037
15.07.2014, 07:08 #2
Во втором фрагменте кода бросаются глаза запятая вместо двоеточия после названия класса.
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
15.07.2014, 10:14 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
QGuest, Потому что действительно нет такой функции. Должно быть
C++
1
virtual int compareTo(char* const other) const { /**/ }
Т.к. функция compareTo принимает const T, а T в данном случае есть char*, учитывая, что
C++
1
const char*
является указателем на константу - это не то что нужно. Нужен константый указатель, который будет
C++
1
char* const
1
Ilot
Модератор
Эксперт С++
1818 / 1176 / 232
Регистрация: 16.05.2013
Сообщений: 3,111
Записей в блоге: 5
Завершенные тесты: 1
15.07.2014, 10:28 #4
Добавлю к ответу ForEveR'а const в обявлении функции тоже входит в ее сигнатуру. Т.е. вот это две разные функции:
C++
1
2
    virtual int compareTo(const Time other) const { /**/ }
    virtual int compareTo(const Time other)  { /**/ }
1
olper
15.07.2014, 11:38
  #5

Не по теме:


Цитата Сообщение от Б. Страуструп
Независимые концепции должны быть представлены независимо и объединятся только при необходимости. При нарушении этого принципа вы либо объединяете несвязанные концепции, либо создаете ненужные зависимости. В любом случае вы получаете менее гибкий набор компонентов для построения системы.
Б. Страуструп
Глава 13. Шаблоны.
Стих первый «Введение»
если более приземленно, то "шаблоны" и виртуальные функции как молоко и селедка, по отдельности вроде ничего, а вместе могут привести к неожиданному результату

0
Voivoid
675 / 278 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
15.07.2014, 11:44 #6
Шаблоны и виртуальные функции вполне удачно сочетаются. Например для реализации type erasure.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2014, 11:44
Привет! Вот еще темы с ответами:

Получить возращаемое значение из виртуальной функции из класса наследника - C++
Здравствуйте, в общем столкнулся непониманием как, получить значение из виртульной функции: class Pointers{ public: virtual...

Stack. определение шаблона функции testStack. (хочу разобраться в коде) - C++
Вот эта программа. Хочу разобраться в коде. #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;Stack&gt; using namespace std; ...

Почему вызывается перегрузка виртуальной функции из приватной секции дочернего класса? - C++
Как вообще такое происходит class A { public: virtual void foo(){std::cout&lt;&lt;&quot;A\n&quot;; } }; class B:public A { private: ...

Как сделать шаблон функции другом шаблона класса? - C++
С обычной функцией понятно: template&lt;class T&gt; class A { friend void f(); } А вот если функция f шаблонная, то указать ее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Yandex
Объявления
15.07.2014, 11:44
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru