Template Binary Search Tree
Memory Handling

I see new but I don't see delete. Your tree leaks memory. It needs to clean up after itself in a destructor. And once you add that, you get into the Rule of Three: you need to add the copy constructor and the copy assignment operator, otherwise you'd still leak when you copy your tree.

Usage

Your code looks like an implementation of std::map, and your usage suggests the same, so it'd be better to change your template arguments from T and V (which mean nothing) to Key and Value. Using value as the key is confusing - you should name it key. Although conventionally nodes for maps in the C++ standard library use std::pair&lt;const Key, Value&gt;s. 

You should make it clear that Key needs to be both LessThanComparable and EqualityComparable, or provide ways of passing comparators in as template arguments.

If I try to search() for something not in the map, x will eventually become nullptr and then you return x-&gt;data. Oops! 

You can insert elements with duplicate values. Is that intentional?

inOrderTreeWalk should be spelled std::ostream&amp; operator&lt;&lt;(std::ostream&amp;, const BinarySearchTree &amp;). 

Other


Avoid using namespace std;, especially in headers. 
Take your arguments by reference to const to avoid having to deal with copies.
You should support erasing elements.
You should look into various balancing algorithms for you tree so that if I insert 1 then 2 then 3 then 4 then 5, I don't end up with linear-time search. 
return 0; from main() is implied, you don't need to explicitly provide it.