#include <iostream> 
#include <memory> 
using  namespace  std; 
 
template  < typename  T> 
class  Array
{ 
public : 
    explicit  Array( size_t  size, const  T&  value =  T( ) ) :  size_( size) , memory_( :: operator  new ( size_* sizeof ( T) ) ) 
    { 
        elements =  new  ( memory_)  T[ size_] ; 
        std:: uninitialized_fill ( elements, elements+ size_, value) ; 
    } 
    // конструктор класса, который создает Array размера size, заполненный значениями value типа T.  
    // Если у класса нет конструктора по умолчанию, то второй аргумент этого конструктора обязателен. 
 
    Array( ) :  size_( 0 ) , elements( new  T[ 0 ] ) { } 
    //   конструктор класса, который можно вызвать без параметров. Должен создавать пустой Array. 
 
    Array( const  Array&  other) :  size_( other.size_ ) , memory_( :: operator  new  ( size_* sizeof ( T) ) ) 
    { 
        elements =  new  ( memory_)  T[ size_] ; 
        std:: uninitialized_copy ( other.elements , other.elements  +  size_, elements) ; 
    } 
    //   конструктор копирования, который создает копию параметра. Для типа T оператор присваивания не определен. 
 
    ~Array( ) 
    { 
        for ( size_t  i =  0 ;  i! = size_; ++ i) 
            elements[ i] .~T( ) ; 
        :: operator  delete [ ] ( elements) ; 
    } 
    //   деструктор, если он вам необходим. 
 
    Array&  operator= ( const  Array&  other) 
    { 
        if ( this == & other)  return  * this ; 
 
        for ( size_t  i =  0 ;  i! = size_; ++ i) 
            elements[ i] .~T( ) ; 
        :: operator  delete [ ] ( memory_) ; 
 
        memory_ =  :: operator  new ( other.size_ ) ; 
        elements =  new  ( memory_)  T[ other.size_ ] ; 
        std:: uninitialized_copy ( other.elements , other.elements  +  size_, elements) ; 
        size_ =  other.size_ ; 
        return  * this ; 
    } 
    //   оператор присваивания. 
 
    size_t  size( )  const  {  return  size_;  } 
    //   возвращает размер массива (количество элементов). 
 
    T&  operator[ ] ( size_t  index)  {  return  elements[ index] ;  } 
    const  T&  operator[ ] ( size_t  index)  const  {  return  elements[ index] ;  } 
    //   две версии оператора доступа по индексу. 
private : 
    size_t  size_; 
    char *  memory_; 
    T*  elements; 
} ; 
 
int  main( )  { 
	Array< float >  ololo{ } ; 
	Array< float >  psh( 12 , 321.099f ) ; 
	std:: cout  <<  "psh[10] = "  <<  psh[ 10 ]  <<  '\n ' ; 
	return  0 ; 
} 
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmNsYXNzIEFycmF5CnsKcHVibGljOgogICAgZXhwbGljaXQgQXJyYXkoc2l6ZV90IHNpemUsIGNvbnN0IFQmIHZhbHVlID0gVCgpKTogc2l6ZV8oc2l6ZSksIG1lbW9yeV8oOjpvcGVyYXRvciBuZXcoc2l6ZV8qc2l6ZW9mKFQpKSkKICAgIHsKICAgICAgICBlbGVtZW50cyA9IG5ldyAobWVtb3J5XykgVFtzaXplX107CiAgICAgICAgc3RkOjp1bmluaXRpYWxpemVkX2ZpbGwoZWxlbWVudHMsIGVsZW1lbnRzK3NpemVfLCB2YWx1ZSk7CiAgICB9CiAgICAvLyDQutC+0L3RgdGC0YDRg9C60YLQvtGAINC60LvQsNGB0YHQsCwg0LrQvtGC0L7RgNGL0Lkg0YHQvtC30LTQsNC10YIgQXJyYXkg0YDQsNC30LzQtdGA0LAgc2l6ZSwg0LfQsNC/0L7Qu9C90LXQvdC90YvQuSDQt9C90LDRh9C10L3QuNGP0LzQuCB2YWx1ZSDRgtC40L/QsCBULiAKICAgIC8vINCV0YHQu9C4INGDINC60LvQsNGB0YHQsCDQvdC10YIg0LrQvtC90YHRgtGA0YPQutGC0L7RgNCwINC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOLCDRgtC+INCy0YLQvtGA0L7QuSDQsNGA0LPRg9C80LXQvdGCINGN0YLQvtCz0L4g0LrQvtC90YHRgtGA0YPQutGC0L7RgNCwINC+0LHRj9C30LDRgtC10LvQtdC9LgoKICAgIEFycmF5KCk6IHNpemVfKDApLCBlbGVtZW50cyhuZXcgVFswXSl7fQogICAgLy8gICDQutC+0L3RgdGC0YDRg9C60YLQvtGAINC60LvQsNGB0YHQsCwg0LrQvtGC0L7RgNGL0Lkg0LzQvtC20L3QviDQstGL0LfQstCw0YLRjCDQsdC10Lcg0L/QsNGA0LDQvNC10YLRgNC+0LIuINCU0L7Qu9C20LXQvSDRgdC+0LfQtNCw0LLQsNGC0Ywg0L/Rg9GB0YLQvtC5IEFycmF5LgogIAogICAgQXJyYXkoY29uc3QgQXJyYXkmIG90aGVyKTogc2l6ZV8ob3RoZXIuc2l6ZV8pLCBtZW1vcnlfKDo6b3BlcmF0b3IgbmV3IChzaXplXypzaXplb2YoVCkpKQogICAgewogICAgICAgIGVsZW1lbnRzID0gbmV3IChtZW1vcnlfKSBUW3NpemVfXTsKICAgICAgICBzdGQ6OnVuaW5pdGlhbGl6ZWRfY29weShvdGhlci5lbGVtZW50cywgb3RoZXIuZWxlbWVudHMgKyBzaXplXywgZWxlbWVudHMpOwogICAgfQogICAgLy8gICDQutC+0L3RgdGC0YDRg9C60YLQvtGAINC60L7Qv9C40YDQvtCy0LDQvdC40Y8sINC60L7RgtC+0YDRi9C5INGB0L7Qt9C00LDQtdGCINC60L7Qv9C40Y4g0L/QsNGA0LDQvNC10YLRgNCwLiDQlNC70Y8g0YLQuNC/0LAgVCDQvtC/0LXRgNCw0YLQvtGAINC/0YDQuNGB0LLQsNC40LLQsNC90LjRjyDQvdC1INC+0L/RgNC10LTQtdC70LXQvS4KCiAgICB+QXJyYXkoKQogICAgewogICAgICAgIGZvcihzaXplX3QgaSA9IDA7IGkhPXNpemVfOysraSkKICAgICAgICAgICAgZWxlbWVudHNbaV0uflQoKTsKICAgICAgICA6Om9wZXJhdG9yIGRlbGV0ZVtdKGVsZW1lbnRzKTsKICAgIH0KICAgIC8vICAg0LTQtdGB0YLRgNGD0LrRgtC+0YAsINC10YHQu9C4INC+0L0g0LLQsNC8INC90LXQvtCx0YXQvtC00LjQvC4KICAgIAogICAgQXJyYXkmIG9wZXJhdG9yPShjb25zdCBBcnJheSYgb3RoZXIpCiAgICB7CiAgICAgICAgaWYodGhpcz09Jm90aGVyKSByZXR1cm4gKnRoaXM7CiAgICAgICAgCiAgICAgICAgZm9yKHNpemVfdCBpID0gMDsgaSE9c2l6ZV87KytpKQogICAgICAgICAgICBlbGVtZW50c1tpXS5+VCgpOwogICAgICAgIDo6b3BlcmF0b3IgZGVsZXRlW10obWVtb3J5Xyk7CgogICAgICAgIG1lbW9yeV8gPSA6Om9wZXJhdG9yIG5ldyhvdGhlci5zaXplXyk7CiAgICAgICAgZWxlbWVudHMgPSBuZXcgKG1lbW9yeV8pIFRbb3RoZXIuc2l6ZV9dOwogICAgICAgIHN0ZDo6dW5pbml0aWFsaXplZF9jb3B5KG90aGVyLmVsZW1lbnRzLCBvdGhlci5lbGVtZW50cyArIHNpemVfLCBlbGVtZW50cyk7CiAgICAgICAgc2l6ZV8gPSBvdGhlci5zaXplXzsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICAvLyAgINC+0L/QtdGA0LDRgtC+0YAg0L/RgNC40YHQstCw0LjQstCw0L3QuNGPLgogICAgICAgIAogICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBzaXplXzsgfQogICAgLy8gICDQstC+0LfQstGA0LDRidCw0LXRgiDRgNCw0LfQvNC10YAg0LzQsNGB0YHQuNCy0LAgKNC60L7Qu9C40YfQtdGB0YLQstC+INGN0LvQtdC80LXQvdGC0L7QsikuCgogICAgVCYgb3BlcmF0b3JbXShzaXplX3QgaW5kZXgpIHsgcmV0dXJuIGVsZW1lbnRzW2luZGV4XTsgfQogICAgY29uc3QgVCYgb3BlcmF0b3JbXShzaXplX3QgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIGVsZW1lbnRzW2luZGV4XTsgfQogICAgLy8gICDQtNCy0LUg0LLQtdGA0YHQuNC4INC+0L/QtdGA0LDRgtC+0YDQsCDQtNC+0YHRgtGD0L/QsCDQv9C+INC40L3QtNC10LrRgdGDLgpwcml2YXRlOgogICAgc2l6ZV90IHNpemVfOwogICAgY2hhciogbWVtb3J5XzsKICAgIFQqIGVsZW1lbnRzOwp9OwoKaW50IG1haW4oKSB7CglBcnJheTxmbG9hdD4gb2xvbG97fTsKCUFycmF5PGZsb2F0PiBwc2goMTIsIDMyMS4wOTlmKTsKCXN0ZDo6Y291dCA8PCAicHNoWzEwXSA9ICIgPDwgcHNoWzEwXSA8PCAnXG4nOwoJcmV0dXJuIDA7Cn0=
				
				 
			
				
			
			
				
	
		
	
		 
	prog.cpp: In instantiation of ‘Array<T>::Array(size_t, const T&) [with T = float; size_t = long unsigned int]’:
prog.cpp:65:31:   required from here
prog.cpp:9:91: error: invalid conversion from ‘void*’ to ‘char*’ [-fpermissive]
     explicit Array(size_t size, const T& value = T()): size_(size), memory_(::operator new(size_*sizeof(T)))
                                                                             ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~