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

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

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

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

08.10.2011, 00:21. Просмотров 2142. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.10.2011, 00:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Предварительное объявление (C++):

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

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

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

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

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

Объявление функции - C++
Что значит подобное объявление: int f() const; Для чего этот &quot;const&quot; ?

6
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 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
2
alkagolik
Заблокирован
08.10.2011, 00:59 #3
Цитата Сообщение от Jupiter Посмотреть сообщение
ну и порядок подключения хедеров в срр файле - сначала бустовые, а потом file.h
а в чем разница?
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.10.2011, 01:05 #4
Цитата Сообщение от alkagolik Посмотреть сообщение
а в чем разница?
Точно не знаю имеет ли значение порядок, но например в VS2010 сталкивался с конфликтом между <boost/asio.hpp> и <windows.h>, оба имели "пересечение" по какому-то хедер файлу, изменил порядок подключения и все заработало.
В QtCreator была аналогичная ситуация но уже с моими хедерами.
0
alex_x_x
бжни
2449 / 1654 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
08.10.2011, 01:10 #5
Цитата Сообщение от norge_goth Посмотреть сообщение
не подключаю в хэдер file.h умышленно, потому что этот хэдер подключается в много других файлов
те для увеличения скорости компиляции?
Цитата Сообщение от norge_goth Посмотреть сообщение
проблема состоит в том чтобы в file.h объявить указатель на сигнал Signal *errorSignal;
максимум это будет работать если указатель не используется
если же он будет использоваться, то все равно потребуется полное инстанцирование шаблона, ну и соответственно подключение хедера
1
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 и попробовать
0
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
0
19.11.2011, 23:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2011, 23:42
Привет! Вот еще темы с ответами:

Объявление конструктора - C++
Изучаю книгу Джосьютиса по STL и столкнулся с немного непонятным объявлением конструктора. Помогите разобраться, правильно ли я его...

объявление массива - C++
int N = 10; int mas = {5,8,2,0,6,3,8,2,7,9}; По чему так нельзя, подчеркивает masN]?

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

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


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

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

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