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

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

Войти
Регистрация
Восстановить пароль
 
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
#1

Наследование шаблона - C++

20.06.2012, 12:53. Просмотров 526. Ответов 13
Метки нет (Все метки)

Есть два шаблона Array and NumericArray
Хочется реализовать между ними иерархию типа NumericArray диревативынй класс а Array родительский.

Вообщем вроде что то получается, но вот какая ошибка вылезла не могли бы посмотреть. Заранее спасибо !

compiler error:
1>------ Build started: Project: HP3_4.2b_ex2_with_inheritance, Configuration: Release Win32 ------
1> main.cpp
1>main.cpp(9): error C2143: syntax error : missing ';' before 'using'
1>main.cpp(9): error C2143: syntax error : missing ';' before '<end Parse>'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


last edition of my code:

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
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
//array.h //array.h //array.h //array.h //array.h //array.h //array.h //array.h 
 
#ifndef Array_H
#define Array_H
 
template <class Type> 
class Array
{
protected:
  int m_size;
  Type* m_data; //m_data should be a pointer, since you want to allocate data to it
 
public:
  Array();
  Array(int new_size);
  virtual ~Array(); //Are there reason making destructor virtual?
  Array<Type>& operator=(const Array& ar); //Const correctness here.
  Type& operator [] (int index);
  const Type& operator [] (int index) const;
  int Size() const;
};
 
#ifndef Array_cpp 
#include "array.cpp"
#endif
 
#endif //Array_CPP
 
//*******************
//*******************
//*******************
//*******************
 
 
//NumericArray.h //NumericArray.h //NumericArray.h //NumericArray.h 
 
 
#ifndef NumericArray_H
#define NumericArray_H
 
#include "array.h"
 
template <class Type> 
class NumericArray: public Array<Type>
{
    public: 
        NumericArray();
        NumericArray(int new_size);
       ~NumericArray(); 
        NumericArray<Type>& operator=(const NumericArray<Type>& ar); 
        NumericArray<Type>& operator *(double factor) const;    
};
 
template <class Type>
NumericArray<Type>::NumericArray() : m_size(10), m_data(0) // default filling of array is zeros!
{
}
 
template <class Type>
NumericArray<Type>::NumericArray(int new_size) : m_size(new_size), m_data(new Type[new_size])
{ 
}
 
template <class Type>
NumericArray<Type>::~NumericArray()
{
  //Technically, the if is not necessary
  if(m_data)
  {
    delete[] m_data;
    m_data = 0;
  }
  //Not necessary either, but just to be clean
  m_size = 0;
}
 
template<class Type>
NumericArray<Type>& NumericArray<Type>::operator *(double factor) const
{
   NumericArray<Type> output(Array<Type>::Size());
   for(int i=0; i<Array::Size(); i++)
   {
      output[i] = (*this)[i] * factor;
      //return output;
   }
   return output;
}
 
template <class Type>
NumericArray<Type>& NumericArray<Type>::operator=(const NumericArray& ar) 
 
#endif //NumericArray_h 
 
//*******************
//*******************
//*******************
//*******************
 
 
 
//point.h //point.h //point.h //point.h //point.h //point.h //point.h //point.h //point.h //point.h 
#include <sstream>
#include <iostream>
 
#ifndef Point_H
#define Point_H
#include "array.h"
 
using namespace std;
class Point
{
private:
    double m_x;                                
    double m_y;                                
public:
    // Constructors
    Point(): m_x(0), m_y(0) {};                            
    Point(double new_x, double new_y) : m_x(new_x), m_y(new_y) {};
    friend ostream& operator << (ostream& os, const Point& point)
{
    return os << point.ToString();
}
    //std::string Point::ToString(void) const                // create a string representation of a point
   string ToString() const
{
// create a string like: “Point(1.5, 3.9)”
      std::ostringstream os;
    os << m_x << " , " << m_y;
    std::string double_string = os.str();
 
    return "Point(" + double_string + ")";
 
}
    //Point Point::operator * (double factor) const;
    Point operator *(double factor) const;   
    //Point& Point::operator *= (double factor); 
    Point & operator *=(double factor);
};
 
#endif //Point_h
 
 
//*******************
//*******************
//*******************
//*******************
 
//array.cpp //array.cpp //array.cpp //array.cpp //array.cpp //array.cpp //array.cpp //array.cpp 
 
 
#include "Array.h"
#include <sstream>
#include <iostream>
//#include <exception>
using namespace std;
#ifndef Array_CPP
#define Array_CPP
 
 
template <class Type>
Array<Type>::Array() : m_size(10), m_data(0) // 
{
}
template <class Type>
Array<Type>::Array(int new_size) : m_size(new_size), m_data(new Type[new_size])
{ 
}
 
template <class Type>
Array<Type>::~Array()
{
  //Technically, the if is not necessary
  if(m_data)
  {
    delete[] m_data;
    m_data = 0;
  }
 
  //Not necessary either, but just to be clean
  m_size = 0;
}
template <class Type>
Array<Type>& Array<Type>::operator=(const Array& ar)
{
  //Check self assign:
  if(this == &ar) {return *this;}
  Array<Type> copy(ar); //Create a copy of ar; If this fails, then *this will not be changed, and nothing will leak
  //Succeeded creating copy. Now we can put it inside this
  this->Swap(copy); //And then swap the copy into this!
  return *this;
}
 
 
 
 
 
template <class Type> 
Type& Array<Type>::operator [] (int index) 
{
    if (index > this->m_size)
    {
        cout << "i am hreeeee" << endl;
        return this->m_data[0];
    }
    return m_data[index];
}
 
template <class Type> 
 const Type& Array<Type>::operator [] (int index) const
 {
  //  cout << "Array [] operator" << endl;
 
    if (index > this->m_size)
    {
        cout << "i am hreeeee" << endl;
        return this->m_data[0];
    }
    return m_data[index];
}
 
template<class Type>
int Array<Type>::Size() const
{
    return this->m_size; 
}
 
 
 
/*template<class Type>
//Type& Array<Type>::operator * (double factor) const
Array<Type> Array<Type>::operator *(double factor) const
{
   Array<Type> output(Array<Type>::Size());
   for(int i=0; i<Array::Size(); i++)
   {
      output[i] = (*this)[i] * factor;
      //return output;
   }
   return output;
}*/
 
 
 
 
 
 
 #endif //Array_CPP
 
//*******************
//*******************
//*******************
//*******************
 
// Point.cpp // Point.cpp // Point.cpp // Point.cpp // Point.cpp // Point.cpp // Point.cpp // Point.cpp 
 
 
#include "Point.h"
#include <sstream>
#include <iostream>
using namespace std;
 
  Point Point::operator * (double factor) const
{
    return Point(m_x * factor, m_y * factor);
}
 
    Point& Point::operator *= (double factor)
        {
    Point tmp = (*this) * factor;
    *this = tmp;
    return *this;
        }
 
 
//****************
//****************
//****************
 
 
//main.cpp //main.cpp //main.cpp //main.cpp //main.cpp //main.cpp //main.cpp //main.cpp 
 
        #include "point.h"
        #include "Array.h"
        #include "array.cpp"
    //  #include <exception>
        #include "NumericArray.h"
        #include <iostream>
        using namespace std;
int main()
{
              //Create two Point arrays and test the operators
    NumericArray<Point> pArray1(5);
    NumericArray<Point> pArray2(5);
    //initialize
    for(int i=0; i<pArray1.Size(); i++) pArray1[i] = Point(i, i);
    for(int i=0; i<pArray2.Size(); i++) pArray2[i] = Point(2*i, 2*i);
 
    //Numeric Array's operations not working for Point objects
 
 
    cout << "times PointArray1 by 3 and print out the new array: "<< endl;
    NumericArray<Point> answ1 = pArray1 * 3;
    
    for(int i=0; i<answ1.Size(); i++)
    {
        cout << answ1[i] << endl;
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.06.2012, 12:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследование шаблона (C++):

Шаблон параметр шаблона и наследование - C++
Есть вот такой базовый класс, который описывает абстрактный доступ к контейнеру stl: template&lt; template&lt;typename, typename&gt; class...

Как правильно производится наследование элементов от шаблона класса? В чем ошибка? - C++
Приведу чисто условный пример. Есть какой-нибудь шаблон класса: template &lt;class tempType&gt; class Base { protected: tempType...

Определение метода-шаблона за пределами шаблона класса - C++
День добрый! Разбираюсь в шаблонах, решил копнуть поглубже. Вот пример: template &lt;typename T1&gt; class K // шаблон класса { public:...

Заменить наследование классов на наследование интерфейсов - C++
#include &lt;iostream&gt; #include &lt;assert.h&gt; using namespace std; int people_on_base = 100; int vehicles_on_base = 100; double...

Наследование конструктора от переменного шаблона - C++
В С++ 11 появилась возможность унаследовать конструктора базового класса при помощи конструкции using. class A { public: ...

Создание шаблона - C++
Задача - сделать шаблон контейнера. То до чего додумался: #include &quot;stdafx.h&quot; #ifndef _TEMPL_H #define _TEMPL_H ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
20.06.2012, 13:27 #2
C++
1
2
template <class Type>
NumericArray<Type>& NumericArray<Type>::operator=(const NumericArray& ar)
Ни реализации, ни ";".
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
20.06.2012, 13:36  [ТС] #3
Цитата Сообщение от ForEveR Посмотреть сообщение
C++
1
2
template <class Type>
NumericArray<Type>& NumericArray<Type>::operator=(const NumericArray& ar)
Ни реализации, ни ";".
ок спасибо я вообще сделал это и но теперь след ошибка

1>------ Build started: Project: HP3_4.2b_ex2_with_inheritance, Configuration: Release Win32 ------
1> main.cpp
1>c:\all my\с++\ha level 6\solution\level 6\hp3_4.2b_ex2_with_inheritance\NumericArray.h(30): error C2614: 'NumericArray<Type>' : illegal member initialization: 'm_data' is not a base or member
1> with
1> [
1> Type=Point
1> ]
1> c:\all my\с++\ha level 6\solution\level 6\hp3_4.2b_ex2_with_inheritance\NumericArray.h(29) : while compiling class template member function 'NumericArray<Type>::NumericArray(int)'
1> with
1> [
1> Type=Point
1> ]
1> main.cpp(14) : see reference to class template instantiation 'NumericArray<Type>' being compiled
1> with
1> [
1> Type=Point
1> ]
1>c:\all my\с++\ha level 6\solution\level 6\hp3_4.2b_ex2_with_inheritance\NumericArray.h(30): error C2614: 'NumericArray<Type>' : illegal member initialization: 'm_size' is not a base or member
1> with
1> [
1> Type=Point
1> ]
1>c:\all my\с++\ha level 6\solution\level 6\hp3_4.2b_ex2_with_inheritance\NumericArray.h(66): warning C4172: returning address of local variable or temporary
1> c:\all my\с++\ha level 6\solution\level 6\hp3_4.2b_ex2_with_inheritance\NumericArray.h(59) : while compiling class template member function 'NumericArray<Type> &NumericArray<Type>erator *(double) const'
1> with
1> [
1> Type=Point
1> ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

"'m_data' is not a base or member" Но почему
Я же реализовал наследование и типа сделал в родительско классе protected (not private ) ... Что опять не так ???
кстати вот реализация = оператора :
C++
1
2
3
4
5
6
7
8
9
10
 template <class Type>
NumericArray<Type>& NumericArray<Type>::operator=(const NumericArray& ar) 
{
  //Check self assign:
  if(this == &ar) {return *this;}
  Array<Type> copy(ar); //Create a copy of ar; If this fails, then *this will not be changed, and nothing will leak
  //Succeeded creating copy. Now we can put it inside this
  this->Swap(copy); //And then swap the copy into this!
 return *this;
}
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
20.06.2012, 13:53 #4
Leeto, А не логичнее-ли просто вызвать создание объекта array? Т.е.
Вместо.
C++
1
2
3
4
template <class Type>
NumericArray<Type>::NumericArray(int new_size) : m_size(new_size), m_data(new Type[new_size])
{ 
}
C++
1
2
3
4
template<class Type>
NumericArray<Type>::NumericArray(int new_size) : Array<Type>(size)
{
}
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
20.06.2012, 14:09  [ТС] #5
Цитата Сообщение от ForEveR Посмотреть сообщение
Leeto, А не логичнее-ли просто вызвать создание объекта array? Т.е.
Вместо.
C++
1
2
3
4
template <class Type>
NumericArray<Type>::NumericArray(int new_size) : m_size(new_size), m_data(new Type[new_size])
{ 
}
C++
1
2
3
4
template<class Type>
NumericArray<Type>::NumericArray(int new_size) : Array<Type>(size)
{
}
Опять что то не так

1>------ Build started: Project: HP3_4.2b_ex2_with_inheritance, Configuration: Release Win32 ------
1> main.cpp
1>c:\all my\с++\ha level 6\solution\level 6\hp3_4.2b_ex2_with_inheritance\NumericArray.h(27): error C2065: 'size' : undeclared identifier
1> c:\all my\с++\ha level 6\solution\level 6\hp3_4.2b_ex2_with_inheritance\NumericArray.h(27) : while compiling class template member function 'NumericArray<Type>::NumericArray(int)'
1> with
1> [
1> Type=Point
1> ]
1> main.cpp(14) : see reference to class template instantiation 'NumericArray<Type>' being compiled
1> with
1> [
1> Type=Point
1> ]
1>c:\all my\с++\ha level 6\solution\level 6\hp3_4.2b_ex2_with_inheritance\NumericArray.h(60): warning C4172: returning address of local variable or temporary
1> c:\all my\с++\ha level 6\solution\level 6\hp3_4.2b_ex2_with_inheritance\NumericArray.h(53) : while compiling class template member function 'NumericArray<Type> &NumericArray<Type>::operator *(double) const'
1> with
1> [
1> Type=Point
1> ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
20.06.2012, 14:11 #6
ну вы хоть ошибки то читаете? написано же, что size - неизвестный идентификатор. в конструкторе у аргумента имя не size а new_size.
и new_size - дуратское имя. когда мы в конструкторе никаких старых размеров еще не было. поэтому логичнее просто size.
на ворнинги тоже обратите внимание. возвращать ссылки или указатели на локальные объекты нельзя. это приведет к падению програмы. в операторе * у вас как раз возвращение ссылки на локальный объект.
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
20.06.2012, 14:18  [ТС] #7
Цитата Сообщение от DU Посмотреть сообщение
ну вы хоть ошибки то читаете? написано же, что size - неизвестный идентификатор. в конструкторе у аргумента имя не size а new_size.
и new_size - дуратское имя. когда мы в конструкторе никаких старых размеров еще не было. поэтому логичнее просто size.
на ворнинги тоже обратите внимание. возвращать ссылки или указатели на локальные объекты нельзя. это приведет к падению програмы. в операторе * у вас как раз возвращение ссылки на локальный объект.
Спасио большое код копилируется !!!
но там воринги есть
1>------ Build started: Project: HP3_4.2b_ex2_with_inheritance, Configuration: Release Win32 ------
1> main.cpp
1>c:\all my\с++\ha level 6\solution\level 6\hp3_4.2b_ex2_with_inheritance\NumericArray.h(60): warning C4172: returning address of local variable or temporary
1> c:\all my\с++\ha level 6\solution\level 6\hp3_4.2b_ex2_with_inheritance\NumericArray.h(53) : while compiling class template member function 'NumericArray<Type> &NumericArray<Type>::operator *(double) const'
1> with
1> [
1> Type=Point
1> ]
1> main.cpp(14) : see reference to class template instantiation 'NumericArray<Type>' being compiled
1> with
1> [
1> Type=Point
1> ]
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

насколько они критичны ? подскажите пожалуйста
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
20.06.2012, 14:19 #8
Уберите ссылку из возвращаемого типа и все.
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
20.06.2012, 14:21 #9
я уже написал что максимально критичны. программа будет вести себя неопределенным образом. скорее всего падать. оператор * должен возвращать объект а не ссылку на него. а вот оператор *= - уже ссылку. обычно один реализуется за счет другого. причем operator * делается как вравило в виде свободной функции.
вообще походче что NumericArray сделан только ради добавления оператора *. Но его можно сделать в виде свободной шаблонной функции для всего семейства классов Array<T>. Если для объектов типа T операция умножения на double корректна, то код будет компилироватся для массива объектов таких типов, если же такой операции нет - то просто не скомпилится попытка использовать такой оператор. если оператор для таких объектов не использовать, то все по прежнему будет компилиться.
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
20.06.2012, 14:25  [ТС] #10
Цитата Сообщение от DU Посмотреть сообщение
ну вы хоть ошибки то читаете? написано же, что size - неизвестный идентификатор. в конструкторе у аргумента имя не size а new_size.
и new_size - дуратское имя. когда мы в конструкторе никаких старых размеров еще не было. поэтому логичнее просто size.
на ворнинги тоже обратите внимание. возвращать ссылки или указатели на локальные объекты нельзя. это приведет к падению програмы. в операторе * у вас как раз возвращение ссылки на локальный объект.
ща попробую сам допереть

Добавлено через 4 минуты
Цитата Сообщение от DU Посмотреть сообщение
вообще походче что NumericArray сделан только ради добавления оператора *. Но его можно сделать в виде свободной шаблонной функции для всего семейства классов Array<T>. Если для объектов типа T операция умножения на double корректна, то код будет компилироватся для массива объектов таких типов, если же такой операции нет - то просто не скомпилится попытка использовать такой оператор. если оператор для таких объектов не использовать, то все по прежнему будет компилиться.
нене там в четкое задание в NumericArray надо еще запихнуть оператор +... Но вообще да вы правы он сдалал иенно для операция * и +
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
20.06.2012, 14:31 #11
я вот к чему. например для класса std::string реализована операция сложения. и ваш базовый класс для массива будет работать со строками. было бы логично воспользоватся возможностью прибавить к массиву строк другую строку, что приведет к сложению к каждому элементу массива этой строки. но в текущей реализации для этого просто Array<std::string> использовать нельзя. Нужно использовать NumericArray<std::string> что выглядит как-то кривовато. Пожно было бы написать одну шаблонную функцию для такого сложения и это бы компилилось в случае, если объекты массива поддерживают операцию сложения

C++
1
2
3
4
5
6
7
8
template <typename T, typename Obj>
Array<T> operator + (const Array<T>& arr, const Obj& obj)
{
    Array<T> result(arr);
    // тут для каждого элемента из массива идет сложение:
    result[i] += obj; // подправил тут. конечно же нужно к result[i] прибавлять
    return result;
}
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
20.06.2012, 14:50  [ТС] #12
Цитата Сообщение от DU Посмотреть сообщение
я вот к чему. например для класса std::string реализована операция сложения. и ваш базовый класс для массива будет работать со строками. было бы логично воспользоватся возможностью прибавить к массиву строк другую строку, что приведет к сложению к каждому элементу массива этой строки. но в текущей реализации для этого просто Array<std::string> использовать нельзя. Нужно использовать NumericArray<std::string> что выглядит как-то кривовато. Пожно было бы написать одну шаблонную функцию для такого сложения и это бы компилилось в случае, если объекты массива поддерживают операцию сложения

C++
1
2
3
4
5
6
7
8
template <typename T, typename Obj>
Array<T> operator + (const Array<T>& arr, const Obj& obj)
{
    Array<T> result(arr);
    // тут для каждого элемента из массива идет сложение:
    result[i] += obj; // подправил тут. конечно же нужно к result[i] прибавлять
    return result;
}
Это на самом деле очень грамотная идея согласен что смотриться криво использование NumericArray но у меня просто задание такое
даже есть схемка UML ская ))
Но огромное вам спасибо что вам не все равно )
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
20.06.2012, 14:55 #13
DU,
было бы логично воспользоватся возможностью прибавить к массиву строк другую строку, что приведет к сложению к каждому элементу массива этой строки.
Слишком уж неочевидное поведение, намного логичнее если бы оператор + реализовывал добавление в конец массива.
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
20.06.2012, 14:59 #14
Ну раз выбор осознанный, то ладно.
Еще в догонку у класса NumericArray нужны только конструкторы, для вызова конструкторов базового класса и дополнительные операторы + и *. Деструктор и оператор = не нужно по новому реализовывать. Все, что нужно уже делается в базовом классе.
Слишком уж неочевидное поведение, намного логичнее если бы оператор + реализовывал добавление в конец массива.
Возможно так и есть. Функции с нормальными именами спасают от таких непоняток.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2012, 14:59
Привет! Вот еще темы с ответами:

Специализация шаблона - C++
Пытаюсь специализировать шаблон для типа float, но не получается. В чем проблема? Компилятор: 1&gt;TemplateArr.obj : error LNK2005:...

специализация шаблона - C++
начал разбираться с шаблонами. если есть структура, и одна функция именно с int должна работать по особенному, написать можно вот так. ...

параметры шаблона - C++
1) работа с параметрами шаблона; 2) создайте класс для обьекта типа &quot;муз. проигрыватель&quot;.постройте UMLдиаграмму. напишите реализацию на...

Ошибка шаблона - C++
Здравствуйте. Для шаблонного класса надо определить, что не использован тип void: template&lt;typename Type&gt; struct IsNoVoid { ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.06.2012, 14:59
Ответ Создать тему
Опции темы

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