Please CC (carbon copy not compiler!) me in any reply as I'm not subscribed - thanks. I've recently moved from G++ 3.3.1 to 3.4.1 and now 3.4.3 I have a suite of software which uses shared memory quite extensively and had built up a class library which in outline does the following: class shm_seg { private: void *base; // Other goodies public: // Constructors and such template<typename T> T* shm_cast(size_t offset) { return reinterpret_cast<T*>(etc etc); } }; This is so I can put (given an offset in the shared memory to a "foo" in segment described by "bar") shm_seg bar; // .... stuff foo *fp = bar.shm_cast<foo>(foooffset); Many versions of C++ including earlier versions of g++ required a "template qualifer" so that the parser didn't get confused as defined in Stroustrup appendix C 13.6 thus foo *fp = bar.template shm_cast<foo>(foooffset); G++ 3.3.* accepts this without warning. It also accepts the other version without the "template" keyword. G++ 3.4.* rejects the latter form with error: `template' (as a disambiguator) is only allowed within templates I agree that it's much better that the compiler figures out what I want without me having to spell it out with spurious-looking "template"s everywhere but wouldn't it be better if this was a "warning" not an "error" to let people phase it out gently? Stroustrup doesn't actually say this only has to be done in a template and in principle you can see why many compilers aren't up to the task. I know I can put "define template_qualifier" either to null or "template" as required but this is 73K lines of code with a goodly percentage of those "#ifdef obscure_machine_937" already. (I wish I could leave out the "<foo>" too but that would mean that the result type would have to be considered). -- John Collins Xi Software Ltd www.xisl.com