On Mon, 2 Jan 2006, Mark Mitchell wrote:

> Richard Guenther wrote:
> > g++ no longer parses
> > 
> >     ScalarCode<CflFunctor<Dim> >(CflFunctor<Dim>(omrot, vis_f))(scratch, 
> > I, cs, nue, v);
> > 
> > correctly, but issues
> > 
> > tramp3d-v4.cpp:53573: error: invalid declarator
> > 
> > which can be fixed by putting parantheses around the decl.  Was this 
> > change intended?  
> 
> I'm not sure; please send me preprocessed source, and I will look into
> it.  It's certainly possible that those changes broke something.
> 
> What do you think the above code is supposed to mean?  Are you declaring
> a constructor for CflFunctor<Dim>, or an unnamed variable of type
> ScalarCode<CflFunctor<Dim> > or ?

It's

  {
    CflFunctor<Dim> tmp1(omrot, vis_f);
    ScalarCode<CflFunctor<Dim> > tmp2(tmp1);
    tmp2.operator()(scratch, I, cs, nue, v);
  }

i.e. instantiating ScalarCode<CflFunctor<Dim> > using the constructor
that takes an argument of type CflFunctor<Dim> that is constructed
with the two params omrot and vis_f and then calling operator() on
the constructed object.

Source is from http://www.suse.de/~rguenther/tramp3d/tramp3d-v4.cpp.gz

A reduced testcase looks like

template <class T>
struct ScalarCode
{
  ScalarCode(const T&);
  template <class A, class B>
  void operator()(const A&, const B&);
};
template <int Dim>
struct CflFunctor
{
  CflFunctor(bool omrot, bool vis_f);
};
struct Bar {};
void foo(bool omrot, bool vis_f, const Bar& x, const Bar& y)
{
  ScalarCode<CflFunctor<3> >(CflFunctor<3>(omrot, vis_f))(x, y);
}

Richard.

Reply via email to