You may delete #pragma once since it is compiler dependent and you already have ifdef guards.
SmartPtr::GetCount should not exist since it is an implementation detail not directly related to the SmartPtr (or at least call it GetCountReferencesToInternalObject, GetCount alone is not very descriptive).
You should implement operator* which returns *m_pInstCounted and get() or GetPtr() which returns m_pInstCounted, and maybe also release() and reset() (see boost::shared_ptr).
About constness:
operator== and operator!= (and the famelic GetCOunt) should be const member functions.
Expanding frob thoughts, implementing "T* SmartPtr<T*>::operator->() const" you would break the rule "const should not expose non const", but since the assignment operator and the copy constructor already break it, there is no sense trying to preserve constness. Here how to break constness with your implementation:
void func(const SmartPtr<T*>& p){ //p->NonConst(); // forbidden! SmartPtr<T*> q(p); q->NonConst(); // allowed!}
To preserve constness you have to implement assignment operators and copy constructors in a different way. Something like:
SmartPtr<T*>::operator=(SmartPtr<T*>& other);SmartPtr<const T*>::operator=(const SmartPtr<T*>& other);SmartPtr<const T*>::operator=(const SmartPtr<T*>& other);
Or
SmartPtr<T*>::operator=(SmartPtr<T*>& other);ConstSmartPtr<T*>::operator=(const SmartPtr<T*>& other);ConstSmartPtr<T*>::operator=(const ConstSmartPtr<T*>& other);
But that's so hard to implement, use and maintain that java and c# do not even have the c++ concept of constness.