Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Eraston
59 / 11 / 3
Регистрация: 09.09.2014
Сообщений: 130
1

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

21.07.2015, 21:24. Просмотров 355. Ответов 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
Ответы с готовыми решениями:

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

Перегрузка оператора для класса
Здравствуйте! Подскажите, пожалуйста, почему так не работает: class ClassA { public: ...

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

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

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

6
Renji
2105 / 1545 / 471
Регистрация: 05.06.2014
Сообщений: 4,484
21.07.2015, 21:40 2
template <> bool File::operator< <base>( const base& v ); (с точкой с запятой в конце, но без кода) в какой-то из хедеров?
0
Eraston
59 / 11 / 3
Регистрация: 09.09.2014
Сообщений: 130
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
2105 / 1545 / 471
Регистрация: 05.06.2014
Сообщений: 4,484
21.07.2015, 22:00 4
base.h включен в два разных cpp файла, да? В этом случае обшивка #define работать не будет. Оставьте в .h файле именно заголовок template <> bool mod::operator< <base>( const base& v ), а код спрячьте в cpp файл.
0
Eraston
59 / 11 / 3
Регистрация: 09.09.2014
Сообщений: 130
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
2105 / 1545 / 471
Регистрация: 05.06.2014
Сообщений: 4,484
21.07.2015, 22:32 6
Цитата Сообщение от Eraston Посмотреть сообщение
Такая штука не робит. Шаблон объявляется и определяется в одном месте (во всяком случае только так работает).
А это не шаблон, это явная специализация шаблона, которая считается за обычную функцию. Соответственно, ее как раз можно разделить на заголовок в .h файле и тело в .cpp.
1
Eraston
59 / 11 / 3
Регистрация: 09.09.2014
Сообщений: 130
22.07.2015, 02:03  [ТС] 7
Renji, собственно, спасибо, за такое важное замечание, но тем не менее и мои танцы с бубном принесли свои плоды, а программа исправно работает.
0
22.07.2015, 02:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2015, 02:03

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

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

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


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

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

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