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

Ошибка компиляции при включении #include <vector> - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Cynacyn
 Аватар для Cynacyn
33 / 33 / 0
Регистрация: 02.05.2013
Сообщений: 109
30.08.2013, 20:53     Ошибка компиляции при включении #include <vector> #1
Есть контейнер, идентичный std::vector
Его код в vvector_vbase.h
Если не включать в code.cpp #include <vector> программа компилируется и выдает ожидаемый результат.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
//vvector_vbase.h
// Принципы и практика использования C++ Глава 19
// Principles and Practice Using C++ Chapter 19
#include <iostream> 
#include <memory>  
#include <utility> 
 
using std::cout;
using std::allocator;
using std::out_of_range;
using std::string;
using std::stringstream;
using std::swap;
using std::auto_ptr;
//------------------------------------------------------------------------------
 
template<class T, class A>
struct vector_base {
    A alloc;
    T* elem;
    int sz;
    int space;
    vector_base() : sz(0), elem(0), space(0) 
    {
        //cout << this << " vector_base::vector_base()" << endl; 
    }
    vector_base(const A& a, int e,  int n)  : alloc(a), elem(alloc.allocate(n)), sz(e), space(n)
    {
        //cout << this << " vector_base::vector_base(const A& a, int n)" << endl; 
    }
    vector_base(const vector_base&);
    vector_base& operator=(const vector_base&);
    ~vector_base() 
    { 
        //cout << this << " vector_base::~vector_base()" << endl; 
        alloc.deallocate(elem,space); 
    }
 
};
 
//------------------------------------------------------------------------------
template<class T, class A>
vector_base<T,A>::vector_base(const vector_base& arg)
    :   sz(arg.sz), space(arg.space), elem(alloc.allocate(arg.space))
{
    //cout << this << " vector_base::vector_base(const vector_base& arg)" << endl; 
    
    for(int i=0; i<arg.sz; i++)
        alloc.construct(&elem[i],arg.elem[i]);
}
 
//------------------------------------------------------------------------------
template<class T, class A>
vector_base<T,A>& vector_base<T,A>::operator=(const vector_base& arg) {
    //cout << this << " vector_base& vector_base::operator=(const vector_base& arg)" << endl; 
 
    if(&arg==this) return *this; // self-assignment
 
    if(arg.space <= space) {
        for(int i=0; i<arg.sz; i++)
            alloc.construct(&elem[i],arg.elem[i]);
        sz = arg.sz;
        return *this;
    }
    
    auto_ptr<T> p(alloc.allocate(arg.space));
 
    for(int i=0; i<arg.sz; i++)
        alloc.construct(&p.get()[i],arg.elem[i]);
    for(int i=0; i<sz; i++)
        alloc.destroy(&elem[i]);
    
    alloc.deallocate(elem,space);
    elem = p.release();
    sz = arg.sz;
    space = arg.space;
    return *this;
 
}
//------------------------------------------------------------------------------
 
template<class T, class A = allocator<T> >
class vvector : private vector_base<T,A> {
/*
invariant:
    для 0<=n<sz elem[n] является n-м элементом
    sz<=space
    если sz<space, то после elem[sz-1] есть место
    для (space-sz) элементов типа T 
*/
 
    void copy(const vvector& arg); // copy elements value. don't carry about its size
 
public:
    vvector() 
    {
        //cout << this << " \tvvector::vvector()" << endl; 
    }
    explicit vvector(int s, const T& val = T()) // constructor; key-word "explicit"  have been added to prevent implicit conversion
    {
        sz = s;
        space = s;
        elem = alloc.allocate(s);
        for(int i=0;i<sz;i++)
            alloc.construct(&elem[i], val);
        //cout << this << " \tvvector::vvector(int s)" << endl; 
    }
  
    vvector(const vvector&);                       // copy constructor: define copy
    vvector& operator=(const vvector&);
  
    ~vvector() { // destructor
        //cout << this << " \tvvector::~vvector()" << endl;
    } 
             
    
    T& operator[](int n) {return elem[n];} // access without range checking
    const T& operator[](int n) const {return elem[n];} // access without range checking
    
    T& at(int n); // access with range checking
    const T& at(int n) const; // access with range checking
 
    int size() const { return sz; }               // the current size
    int capacity() const {return space; }
 
    void reserve(int newalloc);
    void resize(int newsize, T value = T());
    void push_back(T value);
};
 
//------------------------------------------------------------------------------
template<class T, class A>
void vvector<T,A>::copy(const vvector& arg) {
    for(int i=0; i<arg.sz; i++) 
        alloc.construct(&elem[i],arg.elem[i]);
}
 
//------------------------------------------------------------------------------
template<class T, class A>
vvector<T,A>::vvector(const vvector& arg)
// allocate elements, then initialize them by copying
{
    //cout << this << " \t\tvvector::vvector(const vvector& arg)" << endl;
    sz = arg.sz;
    space = arg.sz;
    elem = alloc.allocate(arg.sz);
    copy(arg);
}
 
//------------------------------------------------------------------------------
template<class T, class A>
vvector<T,A>& vvector<T,A>::operator=(const vvector& arg) {
    //cout << this << " \t\tvvector::operator=(const vvector& v)" << endl;
    if(this==&arg) return *this;
 
    if(arg.sz<=space) {
        copy(arg);
        sz=arg.sz;
        return *this;
    }
    auto_ptr<T> p(alloc.allocate(arg.space));
    for(int i=0; i<arg.sz; i++)
        alloc.construct(&p.get()[i],arg.elem[i]);
    for(int i=0; i<sz; i++)
        alloc.destroy(&elem[i]);
    alloc.deallocate(elem,space);
    elem = p.release();
    space = sz = arg.sz;
    return *this;
}
 
 
//------------------------------------------------------------------------------
template<class T, class A>
void vvector<T,A>::reserve(int newalloc) {
 
    //cout << this << " \t\tvvector::reserve(int newalloc), newalloc==" << newalloc << endl;
    if(newalloc<=space) return;
 
    vector_base<T,A> b(alloc,sz,newalloc);
    for(int i=0; i<sz; i++) 
        alloc.construct(&b.elem[i],elem[i]);
    for(int i=0; i<sz; i++) 
        alloc.destroy(&elem[i]);
    
    swap<vector_base<T,A>>(*this,b);
    //cout << "vvector<T,A>::reserve, space == " << space << endl;
    
}
 
//------------------------------------------------------------------------------
template<class T, class A>
void vvector<T,A>::resize(int newsize, T value) {
    //cout << this << " \t\tvvector::resize(int newsize, T value)" << endl;
    if(newsize<0) return;
    if(!newsize) {
        for(int i=0; i<sz; i++) 
            alloc.destroy(&elem[i]);
        alloc.deallocate(elem,space);
        sz = 0;
        space = 0;
        elem = 0;
    }
    else {
        reserve(newsize);
        for(int i=sz; i<newsize; i++) 
            alloc.construct(&elem[i], value);
        for(int i=newsize; i<sz; i++) 
            alloc.destroy(&elem[i]);
        sz = newsize;
    }
}
 
//------------------------------------------------------------------------------
template<class T, class A>
void vvector<T,A>::push_back(T value) {
    //cout << this << " \t\tvvector::push_back(T value), size==" << sz << "; space==" << space << endl;
    if(!space) reserve(8);
    else if (sz==space) reserve(2*space);
    alloc.construct(&elem[sz], value);
    ++sz;
}
 
//------------------------------------------------------------------------------
template<class T, class A> 
T& vvector<T,A>::at(int n) {
    
    if(n<0 || sz<=n) { 
        string s = "wrong index: ";
        stringstream ss;
        ss << n;
        s += ss.str();
        throw out_of_range(s);
    }
    return elem[n];
 
}
 
//------------------------------------------------------------------------------
template<class T, class A> 
const T& vvector<T,A>::at(int n) const {
    if(n<0 || sz<=n) { 
        string s = "wrong index: ";
        stringstream ss;
        ss << n;
        s += ss.str();
        throw out_of_range(s);
    }
    return elem[n];
 
}
 
//------------------------------------------------------------------------------
code.cpp (main):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// code.cpp
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using std::vector;
using std::runtime_error;
using std::exception;
using std::cin;
using std::cout;
using std::endl;
using std::istream;
using std::ostream;
using std::istringstream;
using std::ostringstream;
using std::stringstream;
using std::string;
 
#include "vvector_vbase.h"
 
//-------------------------------------------------------
 
 
inline void keep_window_open(string s)
{
    if (s=="") return;
    cin.clear();
    cin.ignore(120,'\n');
    for (;;) {
        cout << "Please enter " << s << " to exit\n";
        string ss;
        while (cin >> ss && ss!=s)
            cout << "Please enter " << s << " to exit\n";
        return;
    }
}
 
//-------------------------------------------------------
 
int main ()
try{
 
    vvector<int> vi;
    vi.push_back(1);
    vi.push_back(2);
    vi.push_back(3);
 
    keep_window_open("~");
  return 0;
 }
 
catch(exception e) {
    cout << e.what();
    keep_window_open("~");
    return 1;
}
 
catch(...) {
    cout << "Error occurred!";
    keep_window_open("~");
    return 2;
}
 
//-------------------------------------------------------
Если включить #include <vector> то программа не компилируется.
Вывод:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
1>------ Построение начато: проект: EmptyConsole01, Конфигурация: Debug Win32 ------
1>  code.cpp
1>d:\SOFTWARE\VSE2010\VC\include\vector(1544): error C2039: difference_type: не является членом "vector_base<T,A>"
1>          with
1>          [
1>              T=int,
1>              A=std::allocator<int>
1>          ]
1>          d:\SOFTWARE\VSE2010\VC\include\vector(1589): см. ссылку на создание экземпляров класса шаблон при компиляции "std::_Vb_iter_base<_Alloc>"
1>          with
1>          [
1>              _Alloc=vector_base<int,std::allocator<int>>
1>          ]
1>          d:\projects\new\emptyconsole01\emptyconsole01\vvector_vbase.h(185): см. ссылку на создание экземпляров класса шаблон при компиляции "std::_Vb_reference<_Alloc>"
1>          with
1>          [
1>              _Alloc=vector_base<int,std::allocator<int>>
1>          ]
1>          d:\projects\new\emptyconsole01\emptyconsole01\vvector_vbase.h(174): при компиляции функции-члена "void vvector<T>::reserve(int)" класса шаблон
1>          with
1>          [
1>              T=int
1>          ]
1>          d:\projects\new\emptyconsole01\emptyconsole01\vvector_vbase.h(215): при компиляции функции-члена "void vvector<T>::push_back(T)" класса шаблон
1>          with
1>          [
1>              T=int
1>          ]
1>          code.cpp(63): см. ссылку на создание экземпляров класса шаблон при компиляции "vvector<T>"
1>          with
1>          [
1>              T=int
1>          ]
1>d:\SOFTWARE\VSE2010\VC\include\vector(1544): error C2146: синтаксическая ошибка: отсутствие "," перед идентификатором "difference_type"
1>d:\SOFTWARE\VSE2010\VC\include\vector(1544): error C2065: difference_type: необъявленный идентификатор
1>d:\SOFTWARE\VSE2010\VC\include\vector(1548): error C2955: std::_Iterator012: для использования класса шаблон требуется список аргументов шаблон
1>          d:\SOFTWARE\VSE2010\VC\include\xutility(365): см. объявление "std::_Iterator012"
1>d:\SOFTWARE\VSE2010\VC\include\vector(1550): error C2039: size_type: не является членом "vector_base<T,A>"
1>          with
1>          [
1>              T=int,
1>              A=std::allocator<int>
1>          ]
1>d:\SOFTWARE\VSE2010\VC\include\vector(1550): error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "_Sizet"
1>d:\SOFTWARE\VSE2010\VC\include\vector(1550): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>d:\SOFTWARE\VSE2010\VC\include\vector(1550): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>d:\SOFTWARE\VSE2010\VC\include\vector(1558): error C2061: синтаксическая ошибка: идентификатор "_Sizet"
1>d:\SOFTWARE\VSE2010\VC\include\vector(1565): error C2061: синтаксическая ошибка: идентификатор "_Sizet"
1>d:\SOFTWARE\VSE2010\VC\include\vector(1582): error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "_Myoff"
1>d:\SOFTWARE\VSE2010\VC\include\vector(1582): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>d:\SOFTWARE\VSE2010\VC\include\vector(1582): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Помогите пожалуйста разобраться в чём дело.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dmitry94
517 / 187 / 34
Регистрация: 25.05.2012
Сообщений: 780
30.08.2013, 21:10     Ошибка компиляции при включении #include <vector> #2
Сложно сказать по причине невозможности повторить ошибку. У меня все отлично компилируется.

C++
1
2
3
4
5
// code.cpp
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
1>------ Построение начато: проект: test13, Конфигурация: Debug Win32 ------
1>Компиляция...
1>main.cpp
1>Компоновка...
1>Внедрение манифеста...
1>Журнал построения был сохранен в "file://c:\Users\dmitry94_1\Documents\Visual Studio 2008\Projects\test13\test13\Debug\BuildLog.htm"
1>test13 - ошибок 0, предупреждений 0
Cynacyn
 Аватар для Cynacyn
33 / 33 / 0
Регистрация: 02.05.2013
Сообщений: 109
30.08.2013, 21:25  [ТС]     Ошибка компиляции при включении #include <vector> #3
Цитата Сообщение от dmitry94 Посмотреть сообщение
Сложно сказать по причине невозможности повторить ошибку. У меня все отлично компилируется.

C++
1
2
3
4
5
// code.cpp
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
1>------ Построение начато: проект: test13, Конфигурация: Debug Win32 ------
1>Компиляция...
1>main.cpp
1>Компоновка...
1>Внедрение манифеста...
1>Журнал построения был сохранен в "file://c:\Users\dmitry94_1\Documents\Visual Studio 2008\Projects\test13\test13\Debug\BuildLog.htm"
1>test13 - ошибок 0, предупреждений 0
У меня MSVS 2010 Express.
Может быть у Вас настройки компилятора какие-то специальные?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
30.08.2013, 21:32     Ошибка компиляции при включении #include <vector> #4
Цитата Сообщение от dmitry94 Посмотреть сообщение
по причине невозможности повторить ошибку.
Похоже разница в реализации stl.
Мне чисто интуитивно не нравится название vector_base, попробуй заменить его на vvector_base. Так же советую вместо кучи using'ов попробовать везеде писать явно std::.
А подобные вещи
C++
1
difference_type: не является членом "vector_base<T,A>"
обычно появляются когда пытаешься испльзовать std алгоритмы со своим классом, который не имеет нужных typedef'оф.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.08.2013, 21:34     Ошибка компиляции при включении #include <vector> #5
Если попробовать это перенести выше using::std?
C++
1
#include "vvector_vbase.h"
dmitry94
517 / 187 / 34
Регистрация: 25.05.2012
Сообщений: 780
30.08.2013, 21:38     Ошибка компиляции при включении #include <vector> #6
Цитата Сообщение от Cynacyn Посмотреть сообщение
У меня MSVS 2010 Express.
Может быть у Вас настройки компилятора какие-то специальные?
Нет, все по умолчанию. VS2008.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
30.08.2013, 22:24     Ошибка компиляции при включении #include <vector> #7
Поковырял немного. Вся проблема оказалась в использовании swap'а, точнее в том, что в MS реализации <vector> тоже есть swap, который похоже ближе подходит по параметрам шаблона, чем любая перегрузка std::swap(), поэтому она и выбирается. А параметрами этого swap'а являются _Vb_reference, а внутри _Vb_reference есть такая строка
C++
1
typedef _Vb_iter_base<_Alloc> _Mybase;
и уже внутри _Vb_iter_base есть
C++
1
typename _Alloc::difference_type
т.е. ожидается, что внутри vector_base есть этот typedef.

Проблема решается добавлением в vector_base двух строк
C++
1
2
    typedef ptrdiff_t difference_type ;
    typedef size_t size_type ;
и на будущее советую сразу делать все нужные typedef'ы во избежание таких вот непонятных (на первый взгляд) проблем.
Cynacyn
 Аватар для Cynacyn
33 / 33 / 0
Регистрация: 02.05.2013
Сообщений: 109
30.08.2013, 23:12  [ТС]     Ошибка компиляции при включении #include <vector> #8
Цитата Сообщение от Kastaneda Посмотреть сообщение
Поковырял немного. Вся проблема оказалась в использовании swap'а, точнее в том, что в MS реализации <vector> тоже есть swap, который похоже ближе подходит по параметрам шаблона, чем любая перегрузка std::swap(), поэтому она и выбирается. А параметрами этого swap'а являются _Vb_reference, а внутри _Vb_reference есть такая строка
C++
1
typedef _Vb_iter_base<_Alloc> _Mybase;
и уже внутри _Vb_iter_base есть
C++
1
typename _Alloc::difference_type
т.е. ожидается, что внутри vector_base есть этот typedef.

Проблема решается добавлением в vector_base двух строк
C++
1
2
    typedef ptrdiff_t difference_type ;
    typedef size_t size_type ;
и на будущее советую сразу делать все нужные typedef'ы во избежание таких вот непонятных (на первый взгляд) проблем.
Спасибо!
Я мало что понял, потому что практически не использовал typedef. Не проходил ещё.
Что значит "все нужные typedef'ы" ? То есть какие из них нужные?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
30.08.2013, 23:22     Ошибка компиляции при включении #include <vector> #9
Цитата Сообщение от Cynacyn Посмотреть сообщение
Что значит "все нужные typedef'ы" ?
Лень в стандарт лезть, можешь здесь посмотреть, называются member type.
Цитата Сообщение от Cynacyn Посмотреть сообщение
То есть какие из них нужные?
Для работы самого вектора они не нужны, но если ты собираешся использовать свой вектор (или любой другой контейнер) в связке с stl, то тут и всплывает необходимость в этих member type.
Cynacyn
 Аватар для Cynacyn
33 / 33 / 0
Регистрация: 02.05.2013
Сообщений: 109
31.08.2013, 01:15  [ТС]     Ошибка компиляции при включении #include <vector> #10
Цитата Сообщение от Kastaneda Посмотреть сообщение
Лень в стандарт лезть, можешь здесь посмотреть, называются member type.

Для работы самого вектора они не нужны, но если ты собираешся использовать свой вектор (или любой другой контейнер) в связке с stl, то тут и всплывает необходимость в этих member type.
хм... попробую определить свой swap
спасибо.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
31.08.2013, 09:28     Ошибка компиляции при включении #include <vector> #11
Вопрос пришел в ЛС, но отвечу здесь, вдруг кому-то тоже непонятно. Зачем нужны эти typedef'ы как они используются?
Тривиальный пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
template <class T>
class Vector
{
public:
    typedef T value_type;
 
    void push_back(T) {}
};
 
template <class Container>
void func (Container container)
{
    typename Container::value_type val = 0;
    container.push_back(val);
}
 
int main()
{
    Vector<int> vec;
 
    func(vec);
 
    return 0;
}
Есть некий Vector и есть функция func() внутри которой нужно создать объект типа, который хранит этот вектор (грубо говоря нам нужно узнать тип T для вектора). При таком параметере шаблона это сделать невозможно (можно переписать параметр шаблона по другому, тогда компилятор сам определит тип Т, но это другой вопрос). Чтоб сделать это возможным в векоторе определяется typedef на шаблонный T, который называется value_type. Теперь мы можем в любом месте создать объект типа Т, на зная что это за тип, при помощи value_type.
Надеюсь этот пример дает понимание как эти typedef'ы используются на практике.

Теперь про наши typedef'ы, например
C++
1
typedef size_t size_type;
допустим мы используем свой вектор со стандартными функциями и какой-то их этих функций понадобился размер нашего вектора. Казалось бы разработчики STL могли не парится и написать так
C++
1
int vec_size = vec.size();
Но что если мы использовали для своего вектора тип size_t, который хранит размер вектора? Тип size_t является более "широким" типом по сравнению с int'ом и если размер нашего векотора превысил INT_MAX (но свободно помещается в size_t), то в коде выше результат будет не верный (vec_size будет отрицательным). Кто-то подумает: "Хорошо, тогда разработчики STL могли сделать так"
C++
1
size_t vec_size = vec.size();
Да, могли, но что если мы вызвали эту функцию не для контейнера, а просто для какого-то своего класса, в котором размер может быть отрицательным (мало ли для чего это понадобится)? Тогда результат опять будет не верным, т.к. size_t беззнаковый. Поэтому в STL испольуется такая запись
C++
1
typename  OurClass::size_type size = ourObject.size();
где OurCLass получен через аргумент шаблона, а ourObject это переданный нами объект. Т.е. ожидается, что в нашем классе определен typedef для size_type (иначе мы увидим ошибку как в первом посте) и стандартная библиотека будет использовать для размера нашего контейнера правильный тип данных, заданный программистом.

Все необходимые typedef'ы определены в стандарте языка и лучше их всегда определять, даже если некоторые из них могут никогда не понадобится.

Надеюсь понятно объснил, если остались вопросы - пишите.

Добавлено через 8 минут
немного тут подумал - пример про отрицательный размер не очень красивый, потому что не смог придумать реального примера когда это может быть возможно, но общий смысл должен быть понятен - в стандартной библиотеке будут использоваться именно наши типы, который мы задали своими руками, а не те, которые там прописали разарботчики компилятора.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2013, 02:47     Ошибка компиляции при включении #include <vector>
Еще ссылки по теме:

C++ Как добавить элемент структуры с использованием #include <vector> ?
C++ Ошибка при получении vector.size()
C++ Ошибка при использовании vector<bool>

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

Или воспользуйтесь поиском по форуму:
Cynacyn
 Аватар для Cynacyn
33 / 33 / 0
Регистрация: 02.05.2013
Сообщений: 109
01.09.2013, 02:47  [ТС]     Ошибка компиляции при включении #include <vector> #12
Цитата Сообщение от Kastaneda Посмотреть сообщение
Вопрос пришел в ЛС, но отвечу здесь, вдруг кому-то тоже непонятно. Зачем нужны эти
Надеюсь понятно объснил, если остались вопросы - пишите.
Спасибо!
Для чего нужны typedef в целом понятно.

А для чего нужен?
C++
1
typedef ptrdiff_t difference_type ;
И ещё вопрос. Можно ли решить эти проблемы не прибегая к typedef?
Yandex
Объявления
01.09.2013, 02:47     Ошибка компиляции при включении #include <vector>
Ответ Создать тему
Опции темы

Текущее время: 03:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru