"Zhang Lin" <[email protected]> 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 [email protected].
It would be appropriate for [email protected]. 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