所有権エラーが嫌ならthisポインタを保存すればいいだけのこと
ポインタとしての構文動作がしたいなら->()なり、*()なり
オペレータオーバーロードすりゃあいいだろ
#include <iostream>
using namespace std;
#define TEST

template<typename T>class A {
public:
 T* m_p;
 A* m_owner;
 int m_size;
 A() {
  m_owner = this;
  m_p = nullptr;
  m_size = 0;
#ifdef TEST
  cout << "コンストラクタ A"<<endl;
#endif
 }
 A(int n) :A() { m_p = new T[n]; m_size = n; }
 ~A() {
  if (m_owner == this && m_p != nullptr) {
   delete[] m_p; m_p = nullptr; m_size = 0;
#ifdef TEST
   cout << "デストラクタ A" << endl;
#endif
  }
 }
つづき