Re: Two-stage name lookup problem

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Jakub,
  I understand your dilemna.  The best thing I can do for you rightnow is to show the C++ specification paragraph that rules in thecompiler are generated from:
Knowing which names are type names allows the syntax of every templatedefinition to be checked. Nodiagnostic shall be issued for a template definition for which a validspecialization can be generated. If novalid specialization can be generated for a template definition, andthat template is not instantiated, the templatedefinition is ill-formed, no diagnostic required. If a type used in anon-dependent name is incompleteat the point at which a template is defined but is complete at thepoint at which an instantiation is done, andif the completeness of that type affects whether or not the program iswell-formed or affects the semanticsof the program, the program is ill-formed; no diagnostic is required.[Note: if a template is instantiated,errors will be diagnosed according to the other rules in thisStandard. Exactly when these errors are diagnosedis a quality of implementation issue. ] [Example:int j;template<class T> class X {// ...void f(T t, int i, char* p){t = i; // diagnosed if X::f is instantiated// and the assignment to t is an errorp = i; // may be diagnosed even if X::f is// not instantiatedp = j; // may be diagnosed even if X::f is// not instantiated}void g(T t) {+; //may be diagnosed even if X::g is// not instantiated}};—end example]
corey
On 10/26/05, Jakub Pawlewicz <jakub.pawlewicz@xxxxxxxxx> wrote:> I'm confused. I do not want use any pointers and memory allocation. I> wrote a program which is very fast because I was using many inline> templates and no pointers. The program worked find unless I had to> switch to gcc 3.4. In my first post it is important that there are> templates and that I am using non-pointer variable declaration of type> B in function A::f(). Please go back to the original problem.>> I don't know template terminology, but I try my best to describe what> the problem is. So please be gentle if I make something wrong.>> The declaration of A a; in struct B should be allowed if we are able> to postpone instantiation of struct B, because it is a template> struct. The function A::f() is template also, so maybe we could better> postpone the instantiation of the function body. I don't know how can> I do such things. Before two-stage names lookup there was no problem> with such hacks and now I need a workaround..>> 2005/10/26, corey taylor <corey.taylor@xxxxxxxxx>:> > Jakub,> >> >   The declaration of A a; in struct B because it requires an object> > size.  Using a pointer to an incomplete type is allowed.  You could> > create a new A in the B constructor and assign it to a pointer.> >> >   The other errors center around this.  The question about using B b> > has nothing to do with the error above.> >> > Corey> >> > On 10/26/05, Jakub Pawlewicz <jakub.pawlewicz@xxxxxxxxx> wrote:> > > > Your problem is not with templates.> > > >> > > > Here's your problem in a nutshell...> > > >> > > > struct A> > > > {> > > >     int x;> > > >> > > >     struct B> > > >     {> > > >         A a;> > > >     };> > > > };> > > >> > > >> > > > You cannot use A within B, because at that point A is incomplete.> > > >> > > > You can pull B out of A.  If you want B to be in the A namespace, change> > > > 'struct A' to 'namespace A', and make 'struct A_impl', fully declared, and> > > > then use that within 'struct B'.> > >> > > But what about function f(), the member of struct A? I want to declare> > > variable with type B in the body of the function:> > >> > > struct A {> > >     ...> > >     void f()> > >     {> > >         B b;> > >         ...> > >     }> > > };> > >> > > I am aware that kind of code may be ill formed, but when using> > > templates, there should be something like deferred instantiation.> > > Struct B is a template and also function A::f() is a template. Struct> > > B is needed only when function A::f() is used. Struct B should be able> > > to construct member of type A and Struct B do not use function A::f().> > > I want all functions be inline. Any solutions?> > >> >>

[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux