Какой тип имеет int[]
Сразу прошу не предлагать никакие вычурные реализации кода, без использования всяких сторонних библиотек. Мне важно разобраться, а не реализовать как-нибудь. Хочу написать свой небольшой класс умного указателя, чтобы разобраться в этой теме, но столкнулся с такой непонятной вещью: как же определить передаю я массив или передаю один элемент. Решил подсмотреть в теме умные указатели, там вызов происходит следующим образом:
shared_ptr<int[]> p(new int[10]);
как видите они передают в качестве типа int[ ], я попытался сделать тоже самое, но у меня выдает ошибку: error C3863: тип массива "int []" является неназначаемым
Может кто-то знает как заставить работать этот момент?
Мой код:
#include <iostream>
#include "Vector.h"
using namespace std;
template<typename T>
class ptr
{
public:
ptr(T *p)
{
mas = false;
this->p = p;
}
/*======= КОНСТРУКТОР КОТОРЫЙ НАДО РЕАЛИЗОВАТЬ =======*/
ptr(T p)
{
mas = true;
//this->p = p;
}
~ptr()
{
cout << "destruct: " << this->p << ", " << *this->p << endl;
if (mas)
{
delete[] this->p;
}
else
{
delete this->p;
}
cout << "destruct: " << this->p << ", " << *this->p << endl;
*this->p = 0;
cout << "destruct: " << this->p << ", " << *this->p << endl;
this->p = nullptr;
cout << "destruct: " << this->p << endl;
}
T& operator*()
{
return *this->p;
}
private:
T* p;
bool mas;
};
int main()
{
//shared_ptr<int[]> p(new int[10]);
/*Проблемный момент*/
ptr<int[]> p = new int[10]{1,2,3,4,5,6,7,8,9};
//cout << p << endl;
return 0;
}
Ответы (1 шт):
Нужно частично специализировать ваш класс ptr для типов массивов - тогда компилятор сможет определить какой тип был передан, и соответсвенно выберет нужное определение класса:
template<typename T>
class ptr<T[]>
{
public:
...
private:
T* ptr_;
};
Тоесть поэтому и нужен отдельный класс чтобы в нем можно было делать своё отличающееся от типов не-массивов освобождение памяти (delete[] T)