You're not clear about. In your case, Pointer this has a type
BST_Node<K,R>* const
it means you can't change the direction(i don't know how to describe it specifically, like the address the pointer indicates..). If you returns
//BST_Node<K,R>**
return &this;
It means you can change the value of this by the returning value. It's not permitted. So an error occurs.
Why do you have to return a double pointer here?
I saw your edition, and i suppose you can return an NULL in function find() to indicate that you find the key at root. It will be a little complicate when you write a recursive find function, but since you're using loop, you can just add a if statement at the very first of the find function. Write like this in insert function:
if (p == NULL) //if returns the root
/*do sth.*/
Just a tip, i don't ever save any data at root, and usually my tree root will be as long life time as the tree when i'm using a tree.