Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279

Предварительное объявление

08.10.2011, 00:21. Показов 3744. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер,

Есть файл file.h и file.cpp, в file.cpp я делаю подключение #include <boost/signal.hpp>, не подключаю в хэдер file.h умышленно, потому что этот хэдер подключается в много других файлов, проблема состоит в том чтобы в file.h объявить указатель на сигнал Signal *errorSignal;

пробовал сделать предварительное объявление в file.h так:
C++
1
2
3
4
5
6
namespace boost
{
    class signal<void ()>;
}
 
typedef boost::signal<void (pMessage)>* Signal;
и так:
C++
1
2
class boost::signal<void (pMessage)>;
typedef boost::signal<void (pMessage)>* Signal;
В первом случае ругается: 'signal' is not a template и 'boost::signal' is not a template
во втором жалуется на неизвестное пространство boost

Можно ли это как-то обойти? чтобы сделать в хэдере только предварительное объявление

Спасибо
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.10.2011, 00:21
Ответы с готовыми решениями:

Предварительное объявление класса
Имеется код такого вида: class IBase { public: virtual foo() = NULL; .. .. .. };

Предварительное объявление enum класса
В статье https://www.cprogramming.com/c++11/c++11-nullptr-strongly-typed-enum-class.html написано два примера, где предварительное...

Предварительное объявление для класса, помещенного в простанство
Пытаюсь сделать forward declaration для библиотечного класса ostream помещенного в namespace std. Код ниже не катит. Как делается...

6
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
08.10.2011, 00:48
Цитата Сообщение от norge_goth Посмотреть сообщение
C++
1
2
class boost::signal<void (pMessage)>;
typedef boost::signal<void (pMessage)>* Signal;
думаю стоит задекларировать как шабон

C++
1
2
3
4
template< /*...*/ >
class boost::signal;
 
typedef boost::signal<void (pMessage)>* Signal;
ну и порядок подключения хедеров в срр файле - сначала бустовые, а потом file.h
2
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
08.10.2011, 00:59
Цитата Сообщение от Jupiter Посмотреть сообщение
ну и порядок подключения хедеров в срр файле - сначала бустовые, а потом file.h
а в чем разница?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
08.10.2011, 01:05
Цитата Сообщение от alkagolik Посмотреть сообщение
а в чем разница?
Точно не знаю имеет ли значение порядок, но например в VS2010 сталкивался с конфликтом между <boost/asio.hpp> и <windows.h>, оба имели "пересечение" по какому-то хедер файлу, изменил порядок подключения и все заработало.
В QtCreator была аналогичная ситуация но уже с моими хедерами.
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
08.10.2011, 01:10
Цитата Сообщение от norge_goth Посмотреть сообщение
не подключаю в хэдер file.h умышленно, потому что этот хэдер подключается в много других файлов
те для увеличения скорости компиляции?
Цитата Сообщение от norge_goth Посмотреть сообщение
проблема состоит в том чтобы в file.h объявить указатель на сигнал Signal *errorSignal;
максимум это будет работать если указатель не используется
если же он будет использоваться, то все равно потребуется полное инстанцирование шаблона, ну и соответственно подключение хедера
1
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
10.10.2011, 17:36  [ТС]
Короче ничего хорошего с этого не вышло, я думаю можно будет замутить предобъявление шаблона с использованием нового стандарта С++11, именно с Variadic templates
сделать примерно так:
C++
1
2
3
4
5
6
7
namespace boost
{
    template <...>
            class signal;
}
 
typedef boost::signal<void (pMessage)> Signal;
или так:

C++
1
2
3
4
5
6
7
namespace boost
{
    template<typename... Values>
            class signal;
}
 
typedef boost::signal<void (pMessage)> Signal;
над обзавестись поддержкой С++11 и попробовать
0
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
19.11.2011, 23:42  [ТС]
сделал я все-таки предварительное объявление шаблона, но только в другом примере выкладываю, может кому-то пригодится:
C++
1
2
3
4
5
// в хэдере, цель: задекларировать QVariantMap
class QVariant;
class QString;
template < typename Key, typename Value > class QMap;
typedef QMap <QString, QVariant> QVariantMap;
QVariant - qt-ный класс, суть его здесь не важна, важная деталь - не требует шаблонной специализации
QMap - аналог std::map, QString - std::string

дальше в файле реализации подключаем сначала наш хэдер предварительных объявлений, и только потом хэдер с нашими "настоящими" QMap, QVariant и QString
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.11.2011, 23:42
Помогаю со студенческими работами здесь

Два класса в одном заголовочном файле, предварительное объявление
Дико туплю, никак не могу понять, где косячу. Ситуация - есть два описания классов в одном заголовочном файле (все делается с...

Предварительное объявление классов. Вызвать функцию до реализации класса
Приветствую, народ. Пытаюсь реализовать структуру типа патерна &quot;Посредник&quot;. И при реализации взаимодействий возникла проблемка. ...

В некотором вузе абитуриенты проходят предварительное тестирование, по результатам которого могут быть допущен
В некотором вузе абитуриенты проходят предварительное тестирование, по результатам которого могут быть допущены к сдаче вступительных...

Предварительное объявление в Python
class Data(Model): ID = PrimaryKeyField() ues = ForeignKeyField(Ues, to_field='ID') ругается на Ues. класс Ues объявлен...

Предварительное редактирование
Добрый день. Можно ли в Битриксе прежде чем делать какие то изменения на сайте, потестить их как то, не пуская на обозрение...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru