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

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

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

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

08.10.2011, 00:21. Просмотров 2070. Ответов 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

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

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

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

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

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

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

объявление функции - C++
допустим у меня есть программа она использует из библиотеке conio.h функцию getch() вот мне интересно как в программе подключить эту...

Объявление функции - C++
Завдання 1 Створити функцію яка приймає на вхід посилання на карту з ключем цілого типу,та значенням з плаваючою точкою. Другим...

[C++] Объявление строк - C++
Дана строка символов, состоящая из произвольного текста, слова разделены пробелами. Разбить исходную строку на две подстроки, причем первая...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 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
Заблокирован
08.10.2011, 00:59     Предварительное объявление #3
Цитата Сообщение от Jupiter Посмотреть сообщение
ну и порядок подключения хедеров в срр файле - сначала бустовые, а потом file.h
а в чем разница?
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 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
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
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++
Пытаюсь создать матрицу размера n: #include &lt;iostream&gt; using namespace std; int main() { int n,i,j; int m; cout &lt;&lt;...

Объявление указателей - C++
Добрый вечер) имеется код где объявляем указатели. ... int *int_point=0; // 1) int* int_point2=0; //2) ...

Объявление массива - C++
Всем добрый день, очень нужна помощь. Вопрос собственно такой: Объявляется объект class MainClass { MainClass(); ...

Объявление h. файла - C++
Объявил h. файл: #include &lt;iostream&gt; struct dannye { int s; string a; }; ошибки:

Объявление переменных - C++
Помогите с объявлением переменных, даны такие объявления: int m1; int *m2; int **m3; int m4; int *m5; int **m6; int (*m7); ...


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

Или воспользуйтесь поиском по форуму:
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     Предварительное объявление
Ответ Создать тему
Опции темы

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