--- /dev/null
+#ifndef ARRAY_H
+# define ARRAY_H
+
+#include <cstddef>
+
+typedef std::size_t size_t;
+
+template<typename T>
+class Array
+{
+ private:
+ size_t m_size;
+ T *m_array;
+
+ public:
+ Array();
+ Array(size_t n);
+ Array(const Array &other);
+ ~Array();
+
+ Array &operator=(const Array &other);
+
+ T &operator[](size_t i);
+ size_t size(void) const;
+};
+
+#include "Array.tpp"
+
+#endif // ARRAY_H
--- /dev/null
+#include <exception>
+
+template<typename T>
+Array<T>::Array()
+ : m_size(0)
+ , m_array(NULL)
+{
+}
+
+template<typename T>
+Array<T>::Array(size_t n)
+ : m_size(n)
+ , m_array(new T[n])
+{
+}
+
+template<typename T>
+Array<T>::Array(const Array<T> &other)
+ : m_array(NULL)
+{
+ *this = other;
+}
+
+template<typename T>
+Array<T>::~Array()
+{
+ delete[] (m_array);
+}
+
+template<typename T>
+Array<T> &Array<T>::operator=(const Array<T> &other)
+{
+ if (this == &other)
+ return (*this);
+ m_size = other.size();
+ delete[] (m_array);
+ m_array = new T[m_size];
+ for (size_t i(0); i < m_size; ++i)
+ m_array[i] = other.m_array[i];
+ return (*this);
+}
+
+template<typename T>
+T &Array<T>::operator[](size_t i)
+{
+ if (i >= m_size)
+ throw (std::exception());
+ return (m_array[i]);
+}
+
+template<typename T>
+size_t Array<T>::size(void) const
+{
+ return (m_size);
+}
--- /dev/null
+CC := c++
+CFLAGS = -std=c++98 -Wall -Wextra -Werror -Wpedantic
+
+ifneq ("$(wildcard .debug)","")
+ CFLAGS += -g
+endif
+
+RM := rm -f
+
+INCDIR := inc
+INCDIR += $(addsuffix /inc, $(SUBPROJECTS));
+ifneq ($(INCLUDE),)
+ INCLUDE := $(addprefix -I, $(INCDIR))
+endif
+
+SRCDIR := .
+
+SOURCES := main.cpp \
+
+SOURCES := $(addprefix $(SRCDIR)/, $(SOURCES))
+
+OBJECTS := $(SOURCES:.cpp=.o)
+
+NAME := array
+
+all : $(NAME)
+
+debug : .debug
+ $(MAKE) all
+
+nodebug :
+ $(RM) .debug
+ $(MAKE) re
+
+.% :
+ $(MAKE) fclean
+ touch $@
+
+$(NAME) : $(OBJECTS)
+ $(CC) $(CFLAGS) -o $@ $^ $(LINKS)
+
+%.o : %.cpp
+ $(CC) $(CFLAGS) -o $@ -c $< $(INCLUDE)
+
+clean :
+ $(RM) $(OBJECTS)
+
+fclean : clean
+ $(RM) $(NAME)
+
+re : fclean
+ $(MAKE) all
--- /dev/null
+#include "Array.h"
+#include <iostream>
+
+template<typename T>
+void print_array(Array<T> &arr)
+{
+ std::cout << "Array: ";
+ for (size_t i(0); i < arr.size() - 1; ++i)
+ std::cout << arr[i] << ", ";
+ std::cout << arr[arr.size() - 1] << '\n';
+}
+
+int main(void)
+{
+ Array<int> i_arr(5);
+ Array<double> d_arr(3);
+
+ print_array(i_arr);
+ print_array(d_arr);
+ i_arr[0] = 5;
+ i_arr[1] = 15;
+ i_arr[2] = 93;
+ i_arr[3] = 9282384;
+ i_arr[4] = 832;
+ d_arr[0] = 54.54654;
+ d_arr[1] = 0.234541;
+ try
+ {
+ d_arr[2] = 2146584.21;
+ d_arr[3] = 45.24584;
+ }
+ catch (const std::exception &exception)
+ {
+ std::cout << "Cought an invalid access\n";
+ }
+ print_array(i_arr);
+ print_array(d_arr);
+ try
+ {
+ std::cout << i_arr[6];
+ }
+ catch (const std::exception &exception)
+ {
+ std::cout << "Cought an invalid access\n";
+ }
+ return (0);
+}