"Zhang Lin" <zhanglin0...@163.com> writes: > class ACE_Message_Queue_NT;
> template <class T> > ACE_Message_Queue_NT *ACE_Message_Queue_Factory<T>::create_NT_message_queue > (int max_threads) > { > ACE_Message_Queue_NT *tmp = 0; > > tmp = new ACE_Message_Queue_NT (max_threads); > > return tmp; > } > > class ACE_Message_Queue_NT > { > public: > ACE_Message_Queue_NT (int) > { > } > }; > This code can be accepted by Microsoft VC 7.1, but GCC reported the following > error: > main.cpp: In static member function 'static ACE_Message_Queue_NT* > ACE_Message_Queue_Factory<T>::create_NT_message_queue(int)': > main.cpp:15: error: invalid use of incomplete type 'struct > ACE_Message_Queue_NT' > main.cpp:1: error: forward declaration of 'struct ACE_Message_Queue_NT' > > Is there any description about the error above in C++ standard? This question is not appropriate for the mailing list g...@gcc.gnu.org. It would be appropriate for gcc-h...@gcc.gnu.org. Please take any followups to gcc-help. Thanks. C++ templates are not macros. Non-dependent names are looked up at the point of the template definition. They are not looked up at the point of template use. The C++ standard specifies that so that templates behave consistently rather than changing behaviour depending upon when they are instantiated. For more information, look for descriptions of two-phase lookup. I don't use the Microsoft compiler, but I've heard reports that it does not implement two-phase lookup correctly. Ian