Thread overview
possible d error?
Jul 11, 2005
Charles Hixson
Jul 11, 2005
Regan Heath
Jul 11, 2005
Charles Hixson
Jul 11, 2005
Regan Heath
July 11, 2005
enum doesn't seem to be working as defined in the documentation...unless I'm missing something pretty basic.
The code is:
enum   TokenTyp   {tPre, tPost, tConj};
TokenTyp[char[]]   tokenTyp;
void   test()
{  tokenTyp["if"]    =   tPre;
   tokenTyp["then"]  =   3;
   tokenTyp["not"]   =   tPre;
   tokenTyp["or"]    =   2;
   tokenTyp["else"]  =   2;
   tokenTyp["and"]   =   2;
}

The result is:
la1:~/projects/d/AIA/src2$ dmd -c errexample.d
errexample.d(4): undefined identifier tPre
errexample.d(4): cannot implicitly convert expression (tPre) of type int to TokenTyp
errexample.d(6): undefined identifier tPre
errexample.d(6): cannot implicitly convert expression (tPre) of type int to TokenTyp

Relevant examples from thedocumentation are:
enum X { A, B, C }	// named enum
enum { A, B = 5+7, C, D = 8, E }
and
enum X { A=3, B, C }

I tried moving the enum statement to within the body of the function, in case it was a name scoping problem, but the error message didn't change.
July 11, 2005
Try what I have below:

On Mon, 11 Jul 2005 14:22:13 -0700, Charles Hixson <charleshixsn@earthlink.net> wrote:
> enum doesn't seem to be working as defined in the documentation...unless I'm missing something pretty basic.
> The code is:
> enum   TokenTyp   {tPre, tPost, tConj};
> TokenTyp[char[]]   tokenTyp;
> void   test()
> {  tokenTyp["if"]    =   tPre;

tokenTyp["if"]    =   TokenTyp.tPre;

>     tokenTyp["then"]  =   3;
>     tokenTyp["not"]   =   tPre;

tokenTyp["not"]   =   TokenTyp.tPre;

>     tokenTyp["or"]    =   2;
>     tokenTyp["else"]  =   2;
>     tokenTyp["and"]   =   2;
> }

Regan

> The result is:
> la1:~/projects/d/AIA/src2$ dmd -c errexample.d
> errexample.d(4): undefined identifier tPre
> errexample.d(4): cannot implicitly convert expression (tPre) of type int to TokenTyp
> errexample.d(6): undefined identifier tPre
> errexample.d(6): cannot implicitly convert expression (tPre) of type int to TokenTyp
>
> Relevant examples from thedocumentation are:
> enum X { A, B, C }	// named enum
> enum { A, B = 5+7, C, D = 8, E }
> and
> enum X { A=3, B, C }
>
> I tried moving the enum statement to within the body of the function, in case it was a name scoping problem, but the error message didn't change.

July 11, 2005
That did it.  Thanks a lot!

So it was a name scoping problem, but not one that could be solved by localizing the declaration.  I still haven't been able to figure out when I need to use the type.name convention, though I now *usually* get it right, I still don't understand why, and when I run into problems, I don't understand them.  (Or, as this example showed, even recognize what's happening.)


Regan Heath wrote:
> Try what I have below:
> 
> On Mon, 11 Jul 2005 14:22:13 -0700, Charles Hixson  <charleshixsn@earthlink.net> wrote:
>> enum doesn't seem to be working as defined in the documentation...unless  I'm missing something pretty basic.
>> The code is:
>> enum   TokenTyp   {tPre, tPost, tConj};
>> TokenTyp[char[]]   tokenTyp;
>> void   test()
>> {  tokenTyp["if"]    =   tPre;
> 
> tokenTyp["if"]    =   TokenTyp.tPre;
> 
>>     tokenTyp["then"]  =   3;
>>     tokenTyp["not"]   =   tPre;
> 
> tokenTyp["not"]   =   TokenTyp.tPre;
> 
>>     tokenTyp["or"]    =   2;
>>     tokenTyp["else"]  =   2;
>>     tokenTyp["and"]   =   2;
>> }
> 
> Regan
> 
>> The result is:
>> la1:~/projects/d/AIA/src2$ dmd -c errexample.d
>> errexample.d(4): undefined identifier tPre
>> errexample.d(4): cannot implicitly convert expression (tPre) of type int  to TokenTyp
>> errexample.d(6): undefined identifier tPre
>> errexample.d(6): cannot implicitly convert expression (tPre) of type int  to TokenTyp
>>
>> Relevant examples from thedocumentation are:
>> enum X { A, B, C }    // named enum
>> enum { A, B = 5+7, C, D = 8, E }
>> and
>> enum X { A=3, B, C }
>>
>> I tried moving the enum statement to within the body of the function, in  case it was a name scoping problem, but the error message didn't change.
> 
July 11, 2005
Yes, a scoping issue.

On the enum page:
http://www.digitalmars.com/d/enum.html

It says:
"If the enum Identifier is present, the EnumMembers are declared in the scope of the enum Identifier."

Basically a named enum creates a new scope, an un-named one does not, eg.

enum { A,B,C };
enum Named { A,B,C };

void main()
{
  int i = A;
  int j = Named.A;
}

Regan

On Mon, 11 Jul 2005 14:40:06 -0700, Charles Hixson <charleshixsn@earthlink.net> wrote:

> That did it.  Thanks a lot!
>
> So it was a name scoping problem, but not one that could be solved by localizing the declaration.  I still haven't been able to figure out when I need to use the type.name convention, though I now *usually* get it right, I still don't understand why, and when I run into problems, I don't understand them.  (Or, as this example showed, even recognize what's happening.)
>
>
> Regan Heath wrote:
>> Try what I have below:
>>  On Mon, 11 Jul 2005 14:22:13 -0700, Charles Hixson  <charleshixsn@earthlink.net> wrote:
>>> enum doesn't seem to be working as defined in the documentation...unless  I'm missing something pretty basic.
>>> The code is:
>>> enum   TokenTyp   {tPre, tPost, tConj};
>>> TokenTyp[char[]]   tokenTyp;
>>> void   test()
>>> {  tokenTyp["if"]    =   tPre;
>>  tokenTyp["if"]    =   TokenTyp.tPre;
>>
>>>     tokenTyp["then"]  =   3;
>>>     tokenTyp["not"]   =   tPre;
>>  tokenTyp["not"]   =   TokenTyp.tPre;
>>
>>>     tokenTyp["or"]    =   2;
>>>     tokenTyp["else"]  =   2;
>>>     tokenTyp["and"]   =   2;
>>> }
>>  Regan
>>
>>> The result is:
>>> la1:~/projects/d/AIA/src2$ dmd -c errexample.d
>>> errexample.d(4): undefined identifier tPre
>>> errexample.d(4): cannot implicitly convert expression (tPre) of type int  to TokenTyp
>>> errexample.d(6): undefined identifier tPre
>>> errexample.d(6): cannot implicitly convert expression (tPre) of type int  to TokenTyp
>>>
>>> Relevant examples from thedocumentation are:
>>> enum X { A, B, C }    // named enum
>>> enum { A, B = 5+7, C, D = 8, E }
>>> and
>>> enum X { A=3, B, C }
>>>
>>> I tried moving the enum statement to within the body of the function, in  case it was a name scoping problem, but the error message didn't change.
>>