Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Undisputed
212 / 140 / 38
Регистрация: 10.06.2014
Сообщений: 1,698
Завершенные тесты: 3
1

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

26.02.2017, 19:46. Просмотров 757. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2017, 19:46
Ответы с готовыми решениями:

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

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

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

Массивы в заголовочных файлах
в заголовочном файле в описании класса пишу: int _const_iMas =...

Контейнеры STL
Кто знает где найти информацию по поводу стандартных контейнеров STL?...

50
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7079 / 3383 / 458
Регистрация: 04.12.2011
Сообщений: 9,408
Записей в блоге: 5
27.02.2017, 10:59 41
Лучший ответ Сообщение было отмечено Undisputed как решение

Решение

Цитата Сообщение от sys_beginner Посмотреть сообщение
на + "исходный код map" (надеюсь понятно что имеется ввиду)
Это неверно и поэтому не может быть понятно.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Шаблон это информация времени компиляции. Он служит для создания кода при инстанциировании. Это значит, что если Вы включили шаблон, но не определили ни одного инстанса, компилятор не сгенерит ни одного байта кода для исполнения.
Код генерит инстанс. Если у Вас есть инстанс то он генерит код. Если у Вас есть инстанс, но вы не хотите чтобы он генерил код, - не компилируйте.
У Вас момент понимания того, что из себя представляет шаблон как таковой, проходит на удивление бурно и болезненно. Это бывает. Успокойтесь и почитайте. В том числе и то, что Вам тут написали.
1
Undisputed
212 / 140 / 38
Регистрация: 10.06.2014
Сообщений: 1,698
Завершенные тесты: 3
27.02.2017, 11:02  [ТС] 42
IGPIGP,
аа... я понял
то есть пофиг сколько раз включается реализация (естественно не в одну ЕТ)
в конечном счете исходный код зависит от того был ли создан объект(ы)
а ответ оказался прост... спасибо!
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7079 / 3383 / 458
Регистрация: 04.12.2011
Сообщений: 9,408
Записей в блоге: 5
27.02.2017, 11:12 43
Цитата Сообщение от sys_beginner Посмотреть сообщение
аа... я понял

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

Добавлено через 6 минут
Цитата Сообщение от sys_beginner Посмотреть сообщение
то есть пофиг сколько раз включается реализация
как я понимаю, шаблон не есть реализация. Шаблон это чертеж реализации. Когда Вы вручную специализируете шаблон вот тогда Вы пишете реализацию. Иначе это сделает компилятор. Он реализует и сразу генерит код. Этого не видно.
Если честно, то в Вашем вопросе есть интересные моменты. Что например происходит если в шаблоне есть определения не шаблонных методов? Я предполагаю, что оно должно игнорироваться пока нет инстанциирования, но интересно было бы услышать.
Во всяком случае сам стараюсь не совмещать. От греха.
0
Undisputed
212 / 140 / 38
Регистрация: 10.06.2014
Сообщений: 1,698
Завершенные тесты: 3
27.02.2017, 11:29  [ТС] 44
Цитата Сообщение от 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-
Любитель чаепитий
3167 / 1473 / 465
Регистрация: 24.08.2014
Сообщений: 5,207
Записей в блоге: 1
Завершенные тесты: 2
27.02.2017, 11:42 45
Цитата Сообщение от 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
Undisputed
212 / 140 / 38
Регистрация: 10.06.2014
Сообщений: 1,698
Завершенные тесты: 3
27.02.2017, 11:48  [ТС] 46
Цитата Сообщение от GbaLog- Посмотреть сообщение
Думаю, что нет, ведь мы не вызывали функцию foo, а это значит, что инстанса не было
Инстанс (он же объект) - есть.
Наверное просто код foo будет выброшен компилятором, будто его и не писали
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7079 / 3383 / 458
Регистрация: 04.12.2011
Сообщений: 9,408
Записей в блоге: 5
27.02.2017, 14:06 47
Цитата Сообщение от 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-
Любитель чаепитий
3167 / 1473 / 465
Регистрация: 24.08.2014
Сообщений: 5,207
Записей в блоге: 1
Завершенные тесты: 2
27.02.2017, 14:13 48
Цитата Сообщение от IGPIGP Посмотреть сообщение
Я говорю о том, что
А вот со статическими функциями и самому интересно.
Скорее всего инстанс происходит для функции, а не для класса, ведь статическая функция - практически обычная функция, просто помещенная в класс.
Ждем экспертов.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7079 / 3383 / 458
Регистрация: 04.12.2011
Сообщений: 9,408
Записей в блоге: 5
27.02.2017, 14:21 49
Цитата Сообщение от GbaLog- Посмотреть сообщение
практически обычная функция, просто помещенная в класс
Она может и реально зависеть от типов-параметров и скорее всего воспринимается как шаблонная. Смотрите:
C++
1
A::sfoo();
не сработает.
Между инстансом и объектом есть разница, как мне кажется. Вот почему мне всегда было непонятно почему шаблоны называют классами.
Цитата Сообщение от GbaLog- Посмотреть сообщение
Ждем экспертов
Согласен.
0
GbaLog-
Любитель чаепитий
3167 / 1473 / 465
Регистрация: 24.08.2014
Сообщений: 5,207
Записей в блоге: 1
Завершенные тесты: 2
27.02.2017, 14:30 50
Цитата Сообщение от IGPIGP Посмотреть сообщение
скорее всего воспринимается как шаблонная.
Ну да, я и имел ввиду обычную шаблонную функцию.
0
hoggy
Заблокирован
Эксперт С++
27.02.2017, 16:21 51
Цитата Сообщение от 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
27.02.2017, 16:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2017, 16:21

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

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

Начала STL и контейнеры C++
Многие улучшения, сделанные из C в C++ вызывают сомнения и вопросы... Именно...


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

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

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