Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Предобъявление vector, deque, etc.


Автор: borisbn 12.8.2011, 09:40
Добрый день.
Задался вопросом: а можно ли сделать forward declaration для vector или deque
Пробовал так:
Код

namespace std {
    template< class T >
    class allocator;

    template<class T, class A = allocator< T > >
    class vector;
};

получаю ошибку:
Цитата

1>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\vector(16) : warning C4348: 'std::vector' : redefinition of default parameter : parameter 2
1>        d:\work\qprojects\console\console\ddd.h(9) : see declaration of 'std::vector'

Можно ли это сделать вообще ?
Спасибо.

P.S. Думаю, из сообщения об ошибке ясно какой компилятор smile

Автор: volatile 12.8.2011, 10:15
borisbn
Если вы имели ввиду forwarding declaration, то можно так
template<class T, class A>
class vector;

Но это по стандарту не переносимо.
Дальше мысль не буду развивать, так как возможно не понял вашего вопроса - что вы подразумевали под "forwarding".



Автор: borisbn 12.8.2011, 10:21
Цитата(volatile @  12.8.2011,  10:15 Найти цитируемый пост)
Если вы имели ввиду forwarding declaration

Да, его (или её?). Поправил.
Так, как Вы сказали пробовал. При объявлении ф-ции
Код

namespace std {
    template<class T, class A >
    class vector;
};

inline void foo( const std::vector<int> & v ) {}

, использующую vector получаю другую ошибку
Цитата

1>d:\work\qprojects\console\console\ddd.h(16) : error C2976: 'std::vector' : too few template arguments
1>        d:\work\qprojects\console\console\ddd.h(13) : see declaration of 'std::vector'

и ещё кучу букаф.
А объявлять в параметрах ф-ции вектор с аллокатором ну оооооооочень не хочется

Автор: volatile 12.8.2011, 10:38
borisbn, да сорри.
Но в любом случае, даже если вы введете алокатор, это не будет хорошим решением.
Насколько помню, в стандарте не оговаривается сколько аргументов по умолчанию в шаблоне может быть.
То есть вполне вилидна реализация вектора, например такая:
Код

template<class T, class A = something1<T>, class B = something2<T>, class C = something3<T> >
class vector;

знатоки стандарта попровят, если что... smile 

Автор: volatile 12.8.2011, 11:28
Возник вопрос, а зачем? Если вы хотите уменьшить время компиляции, то включите <vector> в "stdafx.h"
Заголовки, включенные туда, по умолчанию будут скомпилирован заранее.
Это заметно увеличивает скорость компиляции больших проектов.

зы: правильное название "forward declaration"

Автор: borisbn 12.8.2011, 13:06
Цитата(volatile @  12.8.2011,  11:28 Найти цитируемый пост)
Возник вопрос, а зачем?

1. Уменьшить время компиляции (про stdafx см. ниже)
2. Унифицировать стиль. А то получается, что всё, что можно объявить предварительно - я объявляю, а std-классы - включаю h-ник.
3. Уже просто из принципа интересно (академический вопрос) smile

По поводу stdafx:
1. У меня проект создаёт VS Qt Integrator, и он делает Not Using Precompiled Headers
2. Это как-то некроссплатформенно... хотя... может у gcc есть Precompiled Headers ? Надо выяснить

Цитата(volatile @  12.8.2011,  11:28 Найти цитируемый пост)
правильное название "forward declaration"

агхрррр. поправил

Автор: Artemon 12.8.2011, 14:15
Как можно увеличить скорость компиляции, если файл vector.h не изменяется (или вы его редактируете ?).

Автор: borisbn 12.8.2011, 14:19
Цитата(Artemon @  12.8.2011,  14:15 Найти цитируемый пост)
Как можно увеличить скорость компиляции, если файл vector.h не изменяется

Если не включен Precompiled Headers, то при изменении моего исходника, в который включен vector.h, последний будет перекомпилироваться.

Цитата(Artemon @  12.8.2011,  14:15 Найти цитируемый пост)
или вы его редактируете ?

я из ума ещё не выжил smile

Автор: Artemon 12.8.2011, 14:58
У меня всегда стоит опция: "Not using precompiled headers" и перекомпиляция идет только измененных файлов и всех зависимых файлов.

VS2005 + Qt 4.4.3

Добавлено через 7 минут и 32 секунды
И еще не совсем понял про vector, в программу вы ведь включаете всеголишь заголовочный файл, а не исходник, поэтому что тут может перекомпилироваться ?

Автор: boostcoder 12.8.2011, 15:11
Цитата(borisbn @  12.8.2011,  13:06 Найти цитируемый пост)
может у gcc есть Precompiled Headers ?

угу.

зы
так и не понял для чего это нужно.. стандартные хидеры, в сравнении с тем же к примеру boost.fusion - просто микрохидеры. никогда не замечал чтоб что-то медленно компилировалось из-за включения в проект:
Код

#include <iostream>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <multiset>
#include <multimap>
#include <algorithm>


по этому, наверное интерес чисто академический.

Автор: borisbn 12.8.2011, 15:19
Цитата(Artemon @  12.8.2011,  14:58 Найти цитируемый пост)
И еще не совсем понял про vector, в программу вы ведь включаете всеголишь заголовочный файл, а не исходник

vector ведь шаблонный... у него нет исходника. только заголовочный и есть, а т.к. он включается в мой заголовочный файл, то при изменении моего исходника, включающего мой заголовочный файл, перекомпилироваться будут все три файла (мой cpp, мой h, vector.h)
Код

// my.cpp
#include "my.h"
...
// вот тут периодически что-то меняется
...


Код

// my.h
#include <vector>
...


Цитата(boostcoder @  12.8.2011,  15:11 Найти цитируемый пост)
по этому, наверное интерес чисто академический.

академический то, академический, но если мне понадобится то же самое сделать не с std-шными классами а с теми же boost'овскими ?

да и просто интересно уже - возможно ли ...

Автор: Artemon 12.8.2011, 15:24
Цитата(borisbn @  12.8.2011,  15:19 Найти цитируемый пост)
vector ведь шаблонный

Действительно 

Автор: boostcoder 12.8.2011, 16:02
Цитата(borisbn @  12.8.2011,  15:19 Найти цитируемый пост)
если мне понадобится то же самое сделать не с std-шными классами а с теми же boost'овскими ?

никогда не задавался таким вопросом.
повторюсь: смысла таки не вижу... ну сэкономишь ты 1мс на единице трансляции. и? smile 

Автор: spyswamp 12.8.2011, 16:46
borisbn, http://stackoverflow.com/questions/307343/forward-declare-an-stl-container читал?

Добавлено через 2 минуты и 19 секунд
А вот тут еще нехило поизвращались: http://stackoverflow.com/questions/555330/templates-use-forward-declarations-to-reduce-compile-time

Кстати, в этом плане разработчики boost большие молодцы, т.к. замутили свои хидеры с forward declaration'ом. ;)

Автор: borisbn 12.8.2011, 17:05
Цитата(spyswamp @  12.8.2011,  16:46 Найти цитируемый пост)
borisbn, http://stackoverflow.com/questions/307343/...n-stl-container читал?

Нет. Как раз собирался туда писать... Спасибо ! Интересно (правда не сама сошка, а ссылка на groups.google и дальнейшая на open-std.org).
Получается (как и говорил volatile), что по стандарту я не застрахован от того, что какая-нить имплементация vector'а не будет иметь доп. параметров.

Автор: spyswamp 12.8.2011, 20:57
borisbn, оффтоп: ну, да, ссылку на comp.std.c++.moderated не стал так выделять, т.к. это очевидно, что ты туда зашел бы. ;)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)