Thread overview
macro
Apr 05, 2002
Roland
Apr 05, 2002
Walter
Apr 05, 2002
Jan Knepper
Apr 06, 2002
Roland
April 05, 2002
i have the macro:

#define __OPEQVAL(val,op)   ( int i; for (i=0; i<DIM; i++) coord[i] op
val; return *this )

and the class:

template <class T, int DIM>
class npoint {
public:
.
.
    npoint<T,DIM>& operator+=(const T a) {
        __OPEQVAL(a,+=);                                    //<-----
here
    }
.
.
public:
    T coord[DIM];
};

does not compile: "identifier found in abstract declarator." if i write like below, it compiles:

    npoint<T,DIM>& operator+=(const T a) {
        int i; for (i=0; i<DIM; i++) coord[i] += a; return
*this;           //same but macro expanded
    }

my questions:
    - is it suposed to compile ?, if not, in few word why ? (just for my
general culture)
    - do i missed something, is there a way to make it compile ?

(I hate cut and past code, write more than once similar code. i can't calculate how much time i lost trying to go faster)

thanks

roland



April 05, 2002
Looks like the trouble is that (int looks like the start of a cast.

"Roland" <rv@ronetech.com> wrote in message news:3CAD70CD.643A290C@ronetech.com...
> i have the macro:
>
> #define __OPEQVAL(val,op)   ( int i; for (i=0; i<DIM; i++) coord[i] op
> val; return *this )
>
> and the class:
>
> template <class T, int DIM>
> class npoint {
> public:
> .
> .
>     npoint<T,DIM>& operator+=(const T a) {
>         __OPEQVAL(a,+=);                                    //<-----
> here
>     }
> .
> .
> public:
>     T coord[DIM];
> };
>
> does not compile: "identifier found in abstract declarator." if i write like below, it compiles:
>
>     npoint<T,DIM>& operator+=(const T a) {
>         int i; for (i=0; i<DIM; i++) coord[i] += a; return
> *this;           //same but macro expanded
>     }
>
> my questions:
>     - is it suposed to compile ?, if not, in few word why ? (just for my
> general culture)
>     - do i missed something, is there a way to make it compile ?
>
> (I hate cut and past code, write more than once similar code. i can't calculate how much time i lost trying to go faster)
>
> thanks
>
> roland
>
>
>


April 05, 2002
Roland, have you tried it as:

#define __OPEQVAL(val,op)   { int i; for (i=0; i<DIM; i++) coord[i] op val;
return *this; }

i.e {} instead of ()?


Jan



Roland wrote:

> i have the macro:
>
> #define __OPEQVAL(val,op)   ( int i; for (i=0; i<DIM; i++) coord[i] op
> val; return *this )
>
> and the class:
>
> template <class T, int DIM>
> class npoint {
> public:
> .
> .
>     npoint<T,DIM>& operator+=(const T a) {
>         __OPEQVAL(a,+=);                                    //<-----
> here
>     }
> .
> .
> public:
>     T coord[DIM];
> };
>
> does not compile: "identifier found in abstract declarator." if i write like below, it compiles:
>
>     npoint<T,DIM>& operator+=(const T a) {
>         int i; for (i=0; i<DIM; i++) coord[i] += a; return
> *this;           //same but macro expanded
>     }
>
> my questions:
>     - is it suposed to compile ?, if not, in few word why ? (just for my
> general culture)
>     - do i missed something, is there a way to make it compile ?
>
> (I hate cut and past code, write more than once similar code. i can't calculate how much time i lost trying to go faster)
>
> thanks
>
> roland

April 06, 2002
Jan Knepper a écrit :

> Roland, have you tried it as:
>
> #define __OPEQVAL(val,op)   { int i; for (i=0; i<DIM; i++) coord[i] op val;
> return *this; }
>
> i.e {} instead of ()?
>
> Jan
>

okay, it seem to work (it compiles) !
thanks jan

roland