Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700

Использование указателей на контейнеры STL в заголовочных файлах

26.02.2017, 19:46. Показов 3032. Ответов 50
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Для использования указателей на I/O классы достаточно включить <iosfwd> который содержит опережающие объявления и таким образом появляется возможность объявить указатель например на stringstream в заголовочном файле
C++
1
2
3
4
//some.h
#include <iosfwd>
 
void bar(std::stringstream *s);
а как быть если хочется объявить указатель в заголовочном файле например на std::map<T,T> или std::string?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.02.2017, 19:46
Ответы с готовыми решениями:

Про добавление заголовочных файлов в заголовочных файлах
В который раз эта вещь засовывает мозги в блендер! Я про то, что не могу однозначно запомнить (основываясь на моих знаниях о директиве...

Использование STL в DLL-файлах
Хочу использовать библиотеку STL в своем DLL-проекте. В частности для обеспечения функциональности требуется применение классов vector и...

Массивы в заголовочных файлах
в заголовочном файле в описании класса пишу: int _const_iMas = {0x63,0x7c,0x78,0x79}; В итоге компилятор подчёркивает знак '='...

50
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.02.2017, 10:59
Лучший ответ Сообщение было отмечено Undisputed как решение

Решение

Студворк — интернет-сервис помощи студентам
Цитата Сообщение от sys_beginner Посмотреть сообщение
на + "исходный код map" (надеюсь понятно что имеется ввиду)
Это неверно и поэтому не может быть понятно.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Шаблон это информация времени компиляции. Он служит для создания кода при инстанциировании. Это значит, что если Вы включили шаблон, но не определили ни одного инстанса, компилятор не сгенерит ни одного байта кода для исполнения.
Код генерит инстанс. Если у Вас есть инстанс то он генерит код. Если у Вас есть инстанс, но вы не хотите чтобы он генерил код, - не компилируйте.
У Вас момент понимания того, что из себя представляет шаблон как таковой, проходит на удивление бурно и болезненно. Это бывает. Успокойтесь и почитайте. В том числе и то, что Вам тут написали.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
27.02.2017, 11:02  [ТС]
IGPIGP,
аа... я понял
то есть пофиг сколько раз включается реализация (естественно не в одну ЕТ)
в конечном счете исходный код зависит от того был ли создан объект(ы)
а ответ оказался прост... спасибо!
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.02.2017, 11:12
Цитата Сообщение от sys_beginner Посмотреть сообщение
аа... я понял

sys_beginner, очень часто бывает так, что тем кто понимает, что происходит в коде уже сложно понять как это может быть непонятно. Я иной раз подмечаю, именно потому, что ещё не достаточно опытен.

Добавлено через 6 минут
Цитата Сообщение от sys_beginner Посмотреть сообщение
то есть пофиг сколько раз включается реализация
как я понимаю, шаблон не есть реализация. Шаблон это чертеж реализации. Когда Вы вручную специализируете шаблон вот тогда Вы пишете реализацию. Иначе это сделает компилятор. Он реализует и сразу генерит код. Этого не видно.
Если честно, то в Вашем вопросе есть интересные моменты. Что например происходит если в шаблоне есть определения не шаблонных методов? Я предполагаю, что оно должно игнорироваться пока нет инстанциирования, но интересно было бы услышать.
Во всяком случае сам стараюсь не совмещать. От греха.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
27.02.2017, 11:29  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
очень часто бывает так, что тем кто понимает, что происходит в коде уже сложно понять как это может быть непонятно.
Есть такой момент )
Цитата Сообщение от IGPIGP Посмотреть сообщение
Что например происходит если в шаблоне есть определения не шаблонных методов? Я предполагаю, что оно должно игнорироваться пока нет инстанциирования, но интересно было бы услышать.
В идеале я думаю должно генериться только необходимое для того что бы работала программа без "лишнего" кода.
Тут наверное уже все зависит от того насколько умен компилятор... может в доках компиляторов написано? Если кто нибудь знает прошу дать ссылку на этот момент в GCC/Clang

Цитата Сообщение от IGPIGP Посмотреть сообщение
Во всяком случае сам стараюсь не совмещать. От греха.
А как? Вдруг по логике это требуется? Как я понимаю вы имеете ввиду что то в таком духе?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<typename T>
struct Foo
{
    void bar(T arg)
    {
    
    }
    //сомнительная карта
    void baz()
    {
    
    }
};
Добавлено через 5 минут
Тогда я думаю все останется как есть просто в зависимости от T будет создано столько bar-ов сколько было для него типов<T>. А baz как был одним так и останется. Ну и будет сгенерирован соответствующий код для выполнения тех методов которые были вызваны.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
27.02.2017, 11:42
Цитата Сообщение от sys_beginner Посмотреть сообщение
что то в таком духе
А в чём смысл? Компилятор, в данном случае, не сгенерирует ни байта под этот класс, пока не будет инстанса. Будет инстанс, будет сгенерирован код для всех методов, в которых шаблоны юзаются. Вообще не понял, о чём товарищ IGPIGP говорит. Код генерируется только если был инстанс.
Другой вопрос, что будет в этом коде, и сгенерируется ли для foo() код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct A
{
  template<typename>
  void foo() {}
  
  void bar() {}
};
 
int main()
{
  A a;
  a.bar();
}
Думаю, что нет, ведь мы не вызывали функцию foo, а это значит, что инстанса не было.
Ну, это моё видение, как оно на самом деле, я могу только догадываться.
2
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
27.02.2017, 11:48  [ТС]
Цитата Сообщение от GbaLog- Посмотреть сообщение
Думаю, что нет, ведь мы не вызывали функцию foo, а это значит, что инстанса не было
Инстанс (он же объект) - есть.
Наверное просто код foo будет выброшен компилятором, будто его и не писали
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.02.2017, 14:06
Цитата Сообщение от GbaLog- Посмотреть сообщение
Вообще не понял, о чём товарищ IGPIGP говорит.
Я говорю о том, что:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream> 
using namespace std; 
template<typename T>
struct A{
void foo(){cout<<"hello word!"<<endl;}
static void sfoo(){cout<<"Hello word!"<<endl;}
};
 
void main()
{
    A<char>::sfoo();//тут есть инстанс или нет? Объекта нет ведь?
    A<int>ia;
    ia.foo();
 
cout<<endl;
cin.get();   
}
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
27.02.2017, 14:13
Цитата Сообщение от IGPIGP Посмотреть сообщение
Я говорю о том, что
А вот со статическими функциями и самому интересно.
Скорее всего инстанс происходит для функции, а не для класса, ведь статическая функция - практически обычная функция, просто помещенная в класс.
Ждем экспертов.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.02.2017, 14:21
Цитата Сообщение от GbaLog- Посмотреть сообщение
практически обычная функция, просто помещенная в класс
Она может и реально зависеть от типов-параметров и скорее всего воспринимается как шаблонная. Смотрите:
C++
1
A::sfoo();
не сработает.
Между инстансом и объектом есть разница, как мне кажется. Вот почему мне всегда было непонятно почему шаблоны называют классами.
Цитата Сообщение от GbaLog- Посмотреть сообщение
Ждем экспертов
Согласен.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
27.02.2017, 14:30
Цитата Сообщение от IGPIGP Посмотреть сообщение
скорее всего воспринимается как шаблонная.
Ну да, я и имел ввиду обычную шаблонную функцию.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.02.2017, 16:21
Цитата Сообщение от sys_beginner Посмотреть сообщение
5. Мне интересно можно ли этого как нибудь избежать (и нужно ли?)
см #30

Цитата Сообщение от sys_beginner Посмотреть сообщение
может ли такое дублирование замедлить выполнение программы?
нет.

Цитата Сообщение от sys_beginner Посмотреть сообщение
Что мне прочитать что бы таких глупых вопросов на эту тему не возникало?
см #32

Добавлено через 2 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
Что например происходит если в шаблоне есть определения не шаблонных методов? Я предполагаю, что оно должно игнорироваться пока нет инстанциирования, но интересно было бы услышать.
они инстанцируются при инстанцированнии самого агрегата.
а затем, если нигде не использовались - линкер их за борт

Добавлено через 2 минуты
Цитата Сообщение от GbaLog- Посмотреть сообщение
и сгенерируется ли для foo() код.
шаблонно-функции-члены инстанцируются только по факту использования.

во времена с++03 это свойство шаблонов использовалось,
для имитации функций с переменным количеством аргументов.

Добавлено через 1 минуту
Цитата Сообщение от IGPIGP Посмотреть сообщение
A<char>::sfoo();//тут есть инстанс или нет? Объекта нет ведь?
есть.

шаблон инстанцируется для типа char

Добавлено через 3 минуты
Цитата Сообщение от sys_beginner Посмотреть сообщение
Инстанс (он же объект) - есть.
инстанс шаблона - это не объект, а класс (или функция/etc),
который компилятор генерирует по шаблону,
на основе формальных параметров,
когда видит какими именно типами этот шаблон параметризуется
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.02.2017, 16:21

О стандартных заголовочных файлах
Не знаю в какую категорию отнести данное нубство, но все же: Часто использую некоторые возможности/функции для которых не делал...

Константы в заголовочных файлах
declare.h #pragma once extern const size_t rows; extern const size_t cols; double initMatrixInput(double matrix);

Множественные ошибки в заголовочных файлах
Компилятор DDK выдает кучу ошибок в его же заголовках — winbase.h, wdm.h, ntdef.h, там выходит около сотни ошибок. Основная масса жалуется...

Линковка, реализация в заголовочных файлах
Ситуация следующая. Представим себет хедер, который содержит некоторый функционал и должен использоваться в нескольких проектах. Причем ...

Определение переменных в заголовочных файлах
Здорова! Определил переменную в заголовочном фале от так #pragma once #ifndef _imya_zagol_fayla #define _imya_zagol_fayla ...


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

Или воспользуйтесь поиском по форуму:
51
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru