Вы переопределяете оператор ->, поэтому, когда вы делаете:
~SmartPointer() { this->!SmartPointer(); }
Вы фактически звоните
~SmartPointer() { m_ptr->!SmartPointer(); }
Я полагаю, что вы можете обойти это, сделав это, хотя:
~SmartPointer() { (*this).!SmartPointer(); }