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

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

Войти
Регистрация
Восстановить пароль
 
Eraston
53 / 10 / 2
Регистрация: 09.09.2014
Сообщений: 127
#1

Перекрестное включение / перегрузка оператора класса извне - C++

21.07.2015, 21:24. Просмотров 325. Ответов 6
Метки нет (Все метки)

Есть 2 модуля: mod.h (содержит модуль для работы с данными) и base.h (содержит родительские классы).
От так это схематично выглядит:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//mod.h
class mod{
    //...
    template <typename T> bool operator< ( const T& v ){
        // ... действия с простыми типами
    }
    //...
}
 
//base.h
#include "mod.h"
class base{
    //...
    void Func(){
        mod m;
        m < var;
    }
    int var;
    //...
}
И в любом месте программы должен быть верным код:
C++
1
2
3
4
mod m;
base b;
//...
m < b;
А для этого нужно определить:
C++
1
2
3
bool mod::operator< ( const base& v ){
    //... действия с классом base
}
Так вот вопрос... Можно задать перегрузку оператора вне mod.h, а то перекрестное включение вызывает полную лажу.

Добавлено через 1 час 35 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//mod.h
class mod{
    //...
    template <typename T> bool operator< ( const T& v ){
        //...
        return 0;
    }
    //...
}
 
//mod.cpp
#include "base.h"
//...
bool File::operator< ( const base& v ){//error c2511
    //...
    return 0;
}
Добавлено через 39 минут
От корректная форма записи
C++
1
template <> bool File::operator< <base>( const base& v )
Но проще не стало. Либо перекрестное подключение хедеров, либо errors LNK2005, LNK1169, вызванный перегрузкой operator<, в какие бы ifndef'ы его не заключал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2015, 21:24
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Перекрестное включение / перегрузка оператора класса извне (C++):

Перегрузка оператора >> для дочернего класса от базового виртуального класса - C++
Доброго вам времени суток! Программирую на С++ не давно, в связи с отсутствием должного времени на поиск ответа в глубинах учебников,...

Перегрузка оператора для класса - C++
Здравствуйте! Подскажите, пожалуйста, почему так не работает: class ClassA { public: ClassA() { m = 1; ...

Перегрузка оператора << шаблонного класса - C++
Всем доброго времени суток! Целый день бьюсь над перегрузкой оператора &lt;&lt; в шаблонном классе одномерный массив. Пока получилось родить...

Перегрузка оператора = в шаблоне класса - C++
Доброго дня! Возник такой вот вопрос: я сделал шаблон класса и пытаюсь перегрузить его оператор присваивания, в итоге получается...

Перегрузка оператора доступа к члену класса - C++
Как осуществляется перегрузка оператора доступа к члену класса? Если можно, то приведите пример

Перегрузка оператора ( ) для объектов класса - C++
Здравствуйте! перегрузили оператор (). Каким образом компилятор поймет где мы вызываем оператор (), а где , например, конструктор? каким...

6
Renji
2113 / 1472 / 346
Регистрация: 05.06.2014
Сообщений: 4,268
21.07.2015, 21:40 #2
template <> bool File::operator< <base>( const base& v ); (с точкой с запятой в конце, но без кода) в какой-то из хедеров?
0
Eraston
53 / 10 / 2
Регистрация: 09.09.2014
Сообщений: 127
21.07.2015, 21:55  [ТС] #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//base.h
#include "mod.h"
class base{
    //...
    void Func(){
        mod m;
        m < var;
    }
    int var;
    //...
}
#ifndef __MOD_OBASE
#define __MOD_OBASE
template <> bool mod::operator< <base>( const base& v ){
    //... действия с классом base
}
#endif
При сборке библиотеки не ругается, а вот при сборке exe-файла выдает errors LNK2005, LNK1169. Хотя включение самого хедера, содержащего перегрузку, если я не слепой, одно единственное.
0
Renji
2113 / 1472 / 346
Регистрация: 05.06.2014
Сообщений: 4,268
21.07.2015, 22:00 #4
base.h включен в два разных cpp файла, да? В этом случае обшивка #define работать не будет. Оставьте в .h файле именно заголовок template <> bool mod::operator< <base>( const base& v ), а код спрячьте в cpp файл.
0
Eraston
53 / 10 / 2
Регистрация: 09.09.2014
Сообщений: 127
21.07.2015, 22:27  [ТС] #5
base.h включен только в одном месте.
Такая штука не робит. Шаблон объявляется и определяется в одном месте (во всяком случае только так работает).

А вообще... Смысл оказался такой. При сборке exe ругался на шаблон в либе в одном из .obj, мол, типа, определен уже в application.obj.
В заголовке проекта подключаю .lib и включаю .h содержащий base.h, в котором определен шаблон, который определен в .lib...
Поэтому короче воткнул #define __MOD_OBASE перед включением .h, что должно исключить повторное определение шаблона в application.obj ...
Более компилятор не ругается на повторное определение, а шаблон используется только внутри lib (в application.obj оно мне не надо). Но пока писал этот пост, загадался вопросом... А будет ли этот перегруженый шаблон использоваться во время исполнения программы? Поэтому пока дописываю
0
Renji
2113 / 1472 / 346
Регистрация: 05.06.2014
Сообщений: 4,268
21.07.2015, 22:32 #6
Цитата Сообщение от Eraston Посмотреть сообщение
Такая штука не робит. Шаблон объявляется и определяется в одном месте (во всяком случае только так работает).
А это не шаблон, это явная специализация шаблона, которая считается за обычную функцию. Соответственно, ее как раз можно разделить на заголовок в .h файле и тело в .cpp.
1
Eraston
53 / 10 / 2
Регистрация: 09.09.2014
Сообщений: 127
22.07.2015, 02:03  [ТС] #7
Renji, собственно, спасибо, за такое важное замечание, но тем не менее и мои танцы с бубном принесли свои плоды, а программа исправно работает.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2015, 02:03
Привет! Вот еще темы с ответами:

Перегрузка оператора- для шаблона класса - C++
Ребят подскажите что не так я делаю или подтолкните в нужное русло =\ З.Ы. Массивы будем рассматривать одинаковой длины. #include...

Перегрузка оператора + для класса Date - C++
Здравствуйте! Как правильно перегрузить оператор +(Date, int) для класса Date, чтобы дата увеличивалась на нужное количество дней? При этом...

Перегрузка оператора ввода вне класса - C++
вечер добрый. можно ли так делать? #include &lt;iostream&gt; struct point { int x, y; }; std::istream &amp; operator &gt;&gt;...

Перегрузка оператора -> для шаблонного класса - C++
Здравствуйте! Возникла проблема: не могу додуматься как перегрузить оператор -&gt; так, чтобы он корректно работал. Вот код: template&lt;class...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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