
Thankyou Lars & Nathan, the addition of the .template has fixed it. I am still confused as to why the "using" statement appeared to fix/hide the problem, but it is good to know the correct solution.
My guess would be that the name lookup process performed by the compiler when resolving the "get" depends on what other things named "get" are in scope. The "using namespace std" function brings std::get into scope which somehow affects the outcome of the name lookup process. C++ is a very hard language for compilers to work with. Even the best compilers just approximate the behaviour prescribed by the C++ standard. Bugs like this one, where the compiler accepts invalid code in some corner cases, naturally get lower priority treatment than bugs where the compiler fails to accept valid code or generates wrong machine code, so they tend to stay around. Regards, Nate