С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Cynacyn
33 / 33 / 0
Регистрация: 02.05.2013
Сообщений: 109
#1

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

30.08.2013, 20:53. Просмотров 1444. Ответов 11
Метки нет (Все метки)

Есть контейнер, идентичный 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 ==========
Помогите пожалуйста разобраться в чём дело.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.08.2013, 20:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка компиляции при включении #include <vector> (C++):

При include<vector> не включает и не видит vector - C++
Не видит vector: //--ClassNeuron.h #ifndef NEURON_H #define NEURON_H #include &lt;cstdlib&gt; #include...

#include - ошибка компиляции - C++
Вывел часть определений переменных и т.п. в отдельный .h файл (допустим defines.h) Описал 2 класса в файлах class1.h и class2.h. К ним...

Работа с файлами в C# с исп. библиотек #include <stdio.h> #include <stdlib.h> #include <math.h> #include <io.h> - C++
В типизированном файле записаны названия городов и их численность. Увеличить численность каждого города на 5% (Количество жителей всегда...

ошибка в лабе не находит #include<iomanip.h> #include<conio.h> - C++
Само задание: Услуги телефонной сети оплачиваются по следующему правилу: за разговоры до A минут в месяц-C руб. а разговоры сверх...

Ошибка при vector - C++
Подскажите в чем может быть проблема? На 1 принтскрине обычный &quot;Hello world&quot; работает нормально. (принтскрин 2) Дальше хочу...

Как добавить элемент структуры с использованием #include <vector> ? - C++
#include &lt;vector&gt; #include &lt;iostream&gt; using namespace std; struct Item { int n; };

11
dmitry94
561 / 191 / 36
Регистрация: 25.05.2012
Сообщений: 799
30.08.2013, 21:10 #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
0
Cynacyn
33 / 33 / 0
Регистрация: 02.05.2013
Сообщений: 109
30.08.2013, 21:25  [ТС] #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.
Может быть у Вас настройки компилятора какие-то специальные?
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,389
Записей в блоге: 2
Завершенные тесты: 1
30.08.2013, 21:32 #4
Цитата Сообщение от dmitry94 Посмотреть сообщение
по причине невозможности повторить ошибку.
Похоже разница в реализации stl.
Мне чисто интуитивно не нравится название vector_base, попробуй заменить его на vvector_base. Так же советую вместо кучи using'ов попробовать везеде писать явно std::.
А подобные вещи
C++
1
difference_type: не является членом "vector_base<T,A>"
обычно появляются когда пытаешься испльзовать std алгоритмы со своим классом, который не имеет нужных typedef'оф.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.08.2013, 21:34 #5
Если попробовать это перенести выше using::std?
C++
1
#include "vvector_vbase.h"
0
dmitry94
561 / 191 / 36
Регистрация: 25.05.2012
Сообщений: 799
30.08.2013, 21:38 #6
Цитата Сообщение от Cynacyn Посмотреть сообщение
У меня MSVS 2010 Express.
Может быть у Вас настройки компилятора какие-то специальные?
Нет, все по умолчанию. VS2008.
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,389
Записей в блоге: 2
Завершенные тесты: 1
30.08.2013, 22:24 #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'ы во избежание таких вот непонятных (на первый взгляд) проблем.
1
Cynacyn
33 / 33 / 0
Регистрация: 02.05.2013
Сообщений: 109
30.08.2013, 23:12  [ТС] #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'ы" ? То есть какие из них нужные?
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,389
Записей в блоге: 2
Завершенные тесты: 1
30.08.2013, 23:22 #9
Цитата Сообщение от Cynacyn Посмотреть сообщение
Что значит "все нужные typedef'ы" ?
Лень в стандарт лезть, можешь здесь посмотреть, называются member type.
Цитата Сообщение от Cynacyn Посмотреть сообщение
То есть какие из них нужные?
Для работы самого вектора они не нужны, но если ты собираешся использовать свой вектор (или любой другой контейнер) в связке с stl, то тут и всплывает необходимость в этих member type.
2
Cynacyn
33 / 33 / 0
Регистрация: 02.05.2013
Сообщений: 109
31.08.2013, 01:15  [ТС] #10
Цитата Сообщение от Kastaneda Посмотреть сообщение
Лень в стандарт лезть, можешь здесь посмотреть, называются member type.

Для работы самого вектора они не нужны, но если ты собираешся использовать свой вектор (или любой другой контейнер) в связке с stl, то тут и всплывает необходимость в этих member type.
хм... попробую определить свой swap
спасибо.
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,389
Записей в блоге: 2
Завершенные тесты: 1
31.08.2013, 09:28 #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 минут
немного тут подумал - пример про отрицательный размер не очень красивый, потому что не смог придумать реального примера когда это может быть возможно, но общий смысл должен быть понятен - в стандартной библиотеке будут использоваться именно наши типы, который мы задали своими руками, а не те, которые там прописали разарботчики компилятора.
1
Cynacyn
33 / 33 / 0
Регистрация: 02.05.2013
Сообщений: 109
01.09.2013, 02:47  [ТС] #12
Цитата Сообщение от Kastaneda Посмотреть сообщение
Вопрос пришел в ЛС, но отвечу здесь, вдруг кому-то тоже непонятно. Зачем нужны эти
Надеюсь понятно объснил, если остались вопросы - пишите.
Спасибо!
Для чего нужны typedef в целом понятно.

А для чего нужен?
C++
1
typedef ptrdiff_t difference_type ;
И ещё вопрос. Можно ли решить эти проблемы не прибегая к typedef?
0
01.09.2013, 02:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2013, 02:47
Привет! Вот еще темы с ответами:

Ошибка при добавлении #include <iostream.h> - C++
Почему при добавлении строчки #include &lt;iostream.h&gt; выдает ошибку fatal error C1083: Cannot open include file: 'iostream.h': No such...

создал "circle.h" файл. При компиляции Cpp файла выдаёт unable to open include file 'circle.h' - C++
Помогите разобраться в чём проблема? Был создан circle.h, а при компиляции cpp файла ругается. Может где путь какой нужно прописать. А...

Ошибка [Linker error] undefined reference to `Vector::Vector(int)' - C++
Добрый день. Делал по методички, и почему-то валятся ошибки... файл lab9_main.cpp #include &lt;iostream&gt; #include &quot;Vector.h&quot; int...

Ошибка исполнения при записи в vector - C++
Вылетает при воде первой строки. Не пойму почему? #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;sstream&gt; #include &lt;fstream&gt; ...


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

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

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