Ah, here we go. add() on line 24 and remove() on line 49 are not members of LinkedList, because you didn't give them any scope, as you did with the constructor, so they're just regular global functions.
According to your structure here, the proper declaration of a LinkedList object is LinkedList<T>, not LinkedList<Node<T> >. You're already passing the template parameter to Node inside the class definition, so unless you want your nodes to contain nodes, you only need to pass T.
Indeed I tried Node and int in place of T (the list is composed of Node objects, so Node would make sense...), no luck. And I will change the var name...
I get
unspecialized class template can't be used as a template argument for template parameter 'T', expected a real type
when using Node in LinkedList<Node> linkedList; declaration.
Edit: Looks like I had made a different mistake in my argument to add that was giving me unrelated (to me) compile errors. I corrected that and am using <int> as the type spec, since LinkedList is using Node<T> in their declarations. It works now, thanks.
(For some reason, passing by value instead of by reference to LinkedList::add caused errors pointing to my declaration of the LinkedList variable...)
add() should take const T &, not Node<T>. It's only annoying to have have to manually construct nodes each time you want to add one to the list. The list should do it automatically.
Also, I just noticed something else in add(). You're iterating from the head of the list to the tail, but the list is doubly-linked. Why not just add to the tail and avoid all those unnecessary iterations?
1. temp=tail
2. tail=new_node
3. tail.prev=temp
4. temp.next=tail
Wow, good point.... this is much easier, conceptually.
So instead of manually creating the nodes on creation, just add whatever (value the node will have) to the list directly, and have the list create the node objects... Yea, that makes perfect sense actually. Will make the notation easier to read (not that that's really a problem), but yea.