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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.75
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
08.10.2011, 00:21     Предварительное объявление #1
Добрый вечер,

Есть файл 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

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

Спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.10.2011, 00:21     Предварительное объявление
Посмотрите здесь:

объявление класса C++
C++ Объявление typedef
Объявление массива C++
Объявление функции C++
C++ Предварительное объявление классов. Вызвать функцию до реализации класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.10.2011, 00:48     Предварительное объявление #2
Цитата Сообщение от 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
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
08.10.2011, 00:59     Предварительное объявление #3
Цитата Сообщение от Jupiter Посмотреть сообщение
ну и порядок подключения хедеров в срр файле - сначала бустовые, а потом file.h
а в чем разница?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.10.2011, 01:05     Предварительное объявление #4
Цитата Сообщение от alkagolik Посмотреть сообщение
а в чем разница?
Точно не знаю имеет ли значение порядок, но например в VS2010 сталкивался с конфликтом между <boost/asio.hpp> и <windows.h>, оба имели "пересечение" по какому-то хедер файлу, изменил порядок подключения и все заработало.
В QtCreator была аналогичная ситуация но уже с моими хедерами.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
08.10.2011, 01:10     Предварительное объявление #5
Цитата Сообщение от norge_goth Посмотреть сообщение
не подключаю в хэдер file.h умышленно, потому что этот хэдер подключается в много других файлов
те для увеличения скорости компиляции?
Цитата Сообщение от norge_goth Посмотреть сообщение
проблема состоит в том чтобы в file.h объявить указатель на сигнал Signal *errorSignal;
максимум это будет работать если указатель не используется
если же он будет использоваться, то все равно потребуется полное инстанцирование шаблона, ну и соответственно подключение хедера
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
10.10.2011, 17:36  [ТС]     Предварительное объявление #6
Короче ничего хорошего с этого не вышло, я думаю можно будет замутить предобъявление шаблона с использованием нового стандарта С++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 и попробовать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2011, 23:42     Предварительное объявление
Еще ссылки по теме:

Объявление переменных C++
C++ Предварительное объявление класса
Объявление функции C++

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

Или воспользуйтесь поиском по форуму:
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
19.11.2011, 23:42  [ТС]     Предварительное объявление #7
сделал я все-таки предварительное объявление шаблона, но только в другом примере выкладываю, может кому-то пригодится:
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
Yandex
Объявления
19.11.2011, 23:42     Предварительное объявление
Ответ Создать тему
Опции темы

Текущее время: 01:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru