[Bug c++/15271] use of nested template classes generates internal error

albertm at uphs dot upenn dot edu gcc-bugzilla@gcc.gnu.org
Mon May 3 21:28:00 GMT 2004


------- Additional Comments From albertm at uphs dot upenn dot edu  2004-05-03 21:28 -------
Subject: Re:  use of nested template classes generates internal
 error

Greetings!

Thank you very much!  The generosity and technical knowledge
of people such as yourself continues to astound me.

Sincerely,
 Mike Albert


On Mon, 3 May 2004, pinskia at gcc dot gnu dot org wrote:

>
> ------- Additional Comments From pinskia at gcc dot gnu dot org  2004-05-03 20:51 -------
> In the 3.4.0 released version I get a good error message:
> pr15271.cc: In function `BGvec_base<Dimension, coeff_t> operator*(k_t, const
> BGvec_base<Dimension, coeff_t>&)':
> pr15271.cc:25: error: expected primary-expression before '>' token
> pr15271.cc: In function `BGvec_base<Dimension, coeff_t> operator*(k_t, const
> BGvec_base<Dimension, coeff_t>&) [with k_t = double, int Dimension = 2, coeff_t = double]':
> pr15271.cc:31:   instantiated from here
> pr15271.cc:25: error: dependent-name `BGvec_base<Dimension, coeff_t>::Ktimes' is parsed as a non-
> type, but instantiation yields a type
> pr15271.cc:25: note: say `typename BGvec_base<Dimension, coeff_t>::Ktimes' if a type is meant
>
> And Here is the fixed up code which works from 2.95.3 to the mainline:
> template<int Dimension, typename coeff_t=double>
> class BGvec_base{
>         public:
>         //default constructor, default copy constructor, default assignment
>         double& operator[](int i){ return v[i]; }
>         const double& operator[](int i) const { return v[i]; }
>
>         template<typename k_t>
>         class Ktimes : public BGvec_base{
>                 public:
>                 Ktimes( k_t k, const BGvec_base& A ){
>                         for(int i=0; i<Dimension; ++i) v[i] = k*A[i];
>                 }
>         };
>
>
>         protected:
>         coeff_t v[Dimension];
> };
>
> template<typename k_t, int Dimension, typename coeff_t>
> BGvec_base<Dimension, coeff_t> operator*
>                         ( k_t k, const BGvec_base<Dimension,coeff_t>& A)
> {
>         return typename BGvec_base<Dimension,coeff_t>::template Ktimes<k_t> (k,A);
> }
>
> int main(int argc, char *argv[])
> {
>         BGvec_base<2> A; A[0] = 5.0; A[1] = 7.0;
>         BGvec_base<2> B = 2.0*A;
> }
>
> --
>            What    |Removed                     |Added
> ----------------------------------------------------------------------------
>              Status|UNCONFIRMED                 |RESOLVED
>            Keywords|                            |ice-on-invalid-code
>          Resolution|                            |FIXED
>    Target Milestone|---                         |3.4.0
>
>
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15271
>
> ------- You are receiving this mail because: -------
> You reported the bug, or are watching the reporter.
>


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15271



More information about the Gcc-bugs mailing list