Where you have implemented the static pointers, you have placed the asterisk in the wrong place; it needs to be before the class name part of the declaration. Actually, this is one example where placing the asterisk next to the type name, instead of putting it with the variable, would help not make these sorts of mistakes:
Least_Recently_Used* Least_Recently_Used::next = NULL; Least_Recently_Used* Least_Recently_Used::head = NULL;
Least_Recently_Used* Least_Recently_Used::tail = NULL;
not, as you have it, after the double colon (::*).
That will solve the problem.
However, since you have declared these static, I think you should not use the "this->" pointer to access them. (The C++ compiler doesn't seem to mind, but it seems a somewhat odd thing to do).
You should seriously consider whether you mean these variables to be static, meaning that there is only one instance of them used by all objects of this type. Or should they rather be instance members of the object.
If you really do need them to be static, for whatever reason, you need to consider thread safety, and you need to consider what is managing the memory they point to - when does it get allocated, and perhaps more importantly, when will it be released? Etc, etc.
On further examination, "next" should definitely not be static! Presumably this is some sort of linked-list, with a "head" and a "tail". "next", it would seem, should point to the next member in the list, but by having is static you only have one "next" value for the whole lot, so your linked list is broken.
Furthermore, when you do this:
this->tail = --this->tail;
have you got any idea (or can you be sure) what "tail" will be pointing to? Do you rather need to turn your "Least_Recently_Used" class into a double-linked list item - by adding a "prev" ("previous") member, so that you could do something like this instead:
tail = tail->prev;
Regards,
Ian.