Ваша проблема в том, что Вы компилируете сишный код компилятором c++. В c допускается неявное преобразование void* (который возвращает malloc) в T*, а вот в c++ это уже запрещено.
Поэтому, если код именно сишный, нужно и исходник компилировать как сишный. Для Visual Studio для этого обычно достаточно изменить расширение файла на .c.
Если же требуется обеспечить сборку в режиме c++, то требуется явное приведение типов, о котором уже сказано в другом ответе.
#include<iostream>#include<conio.h>usingnamespace std;template<class T>class Dynamic_array
{private:
T iSize, iStep, iCurInd;
T * pArray;void Add_Mem();public:
Dynamic_array(): iSize(2), iStep(2), iCurInd(0), pArray(new T *[iSize]){for( T i=0; i<iSize;++i )
pArray[i]=NULL;}
~Dynamic_array(){for( T i=0; i<iSize+1;++i )delete pArray[i];delete pArray;}void Add();void Show();};template<class T>void Dynamic_array <T>::Add_Mem(){cout<<"nAdding memory..."<< endl;
T * pTemp =new T *[iSize+iStep];for( T i=0; i<(iSize+iStep);++i )
pTemp[i]=NULL;for( T i=0; i<iSize;++i )
pTemp[i]= pArray[i];delete[] ppAr;
pArray = pTemp;
iSize += iStep;}template<class T>void Dynamic_array <T>::Add(){if( iCurInd==iSize )
Add_Mem();
pArray[iCurInd++]=new T;}template<class T>void Dynamic_array <T>::Show(){if(Add())cout<<"Add successful"<<endl;}int main(){
Dynamic_array<int> d;
d.Add();
d.Show();if(_CrtDumpMemoryLeaks()!=0)cout<<"Oops!"<< endl;
_getch();cout<< endl;return0;}
0
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.07.2013, 22:08
2
Аццкий Прогер, судя по названию класса, должен быть динамический массив. Но, судя по коду, например, деструктора, складывается впечатление, что это какая-то матрица.
1. Почему iSize, iStep, iCurInd имеют тип T? Должен быть обычный интегральный тип (int или size_t например).
2. В инициализаторе конструктора тип поля pArray не соответствует инициализируемому значению. Лишняя *.
3. Деструктор не понятный для массива.
4. Метод Add(), скорее всего, должен принимать аргумент, которым будет инициализировано добавляемое значение.
5. И т.д….
0
21 / 10 / 5
Регистрация: 07.01.2013
Сообщений: 222
16.07.2013, 22:54
[ТС]
3
Сообщение от Tulosba
Аццкий Прогер, судя по названию класса, должен быть динамический массив. Но, судя по коду, например, деструктора, складывается впечатление, что это какая-то матрица.
1. Почему iSize, iStep, iCurInd имеют тип T? Должен быть обычный интегральный тип (int или size_t например).
2. В инициализаторе конструктора тип поля pArray не соответствует инициализируемому значению. Лишняя *.
3. Деструктор не понятный для массива.
4. Метод Add(), скорее всего, должен принимать аргумент, которым будет инициализировано добавляемое значение.
5. И т.д….
1. согласен, тут вполне и инта хватит.
2. Тоже так подумал, но потом компилятор выдал другую ошибку: C2440: инициализация: невозможно преобразовать «int *» в «int» — вот такую.
3. что именно там не понятно? объясни свою мысль пожалуйста.
4. В обычной ситуации, так оно и было бы, но функция адд нужна, чтобы был своеобразный доступ к скрытой в привате функции адд_мем.
5. И т.д.
поясните, что делаю не так, я только начал изучать С++. И ясно дело, еще многое не понимаю.