[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.c++

How to declare an enum type?

bashill.zhu@gmail.com

9/26/2008 8:52:00 AM

bzhu@TY-PC /h/working/tcplex/ch8/testenum
$ cat lexer.h
namespace Lexer
{
enum Token_value;
extern Token_value string_value;
void get_token();
}

bzhu@TY-PC /h/working/tcplex/ch8/testenum
$ cat lexer.cpp
#include "lexer.h"
namespace Lexer{
enum Token_value{
one,two
};
}
void Lexer::get_token()
{
}



bzhu@TY-PC /h/working/tcplex/ch8/testenum
$ g++ -c lexer.cpp
In file included from lexer.cpp:1:
lexer.h:3: error: use of enum `Token_value' without previous
declaration
lexer.h:4: error: `Token_value' does not name a type

Thanks !

7 Answers

Hendrik Schober

9/26/2008 8:59:00 AM

0

bashill.zhu@gmail.com wrote:
> [...]
> $ g++ -c lexer.cpp
> In file included from lexer.cpp:1:
> lexer.h:3: error: use of enum `Token_value' without previous
> declaration

That should probably read "definition".

> lexer.h:4: error: `Token_value' does not name a type
>
> Thanks !

What's your point?

Schobi

Pete Becker

9/26/2008 11:04:00 AM

0

On 2008-09-26 04:51:56 -0400, "bashill.zhu@gmail.com"
<bashill.zhu@gmail.com> said:

> bzhu@TY-PC /h/working/tcplex/ch8/testenum
> $ cat lexer.h
> namespace Lexer
> {
> enum Token_value;
> extern Token_value string_value;
> void get_token();
> }
>
> bzhu@TY-PC /h/working/tcplex/ch8/testenum
> $ cat lexer.cpp
> #include "lexer.h"
> namespace Lexer{
> enum Token_value{
> one,two
> };
> }
> void Lexer::get_token()
> {
> }
>
>
>
> bzhu@TY-PC /h/working/tcplex/ch8/testenum
> $ g++ -c lexer.cpp
> In file included from lexer.cpp:1:
> lexer.h:3: error: use of enum `Token_value' without previous
> declaration
> lexer.h:4: error: `Token_value' does not name a type
>

You'd have the same problem if you used a forward declaration of a
class in place of an enum. In general, you can't create objects of
incomplete types, and "enum Token_value;" declares an incomplete type.
The code should have the complete definition of Token_value before it's
used.

--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)

bashill.zhu@gmail.com

9/26/2008 1:42:00 PM

0

On 9?26?, ??4?59?, Hendrik Schober <spamt...@gmx.de> wrote:
> bashill....@gmail.com wrote:
> > [...]
> > $ g++ -c lexer.cpp
> > In file included from lexer.cpp:1:
> > lexer.h:3: error: use of enum `Token_value' without previous
> > declaration
>
> That should probably read "definition".
>
> > lexer.h:4: error: `Token_value' does not name a type
>
> > Thanks !
>
> What's your point?
>
> Schobi

I want write a modual that expose a "string_value" var which type is
enum Token_value.
and a function "get_token" which
returns a Token_value var.
I modify the code,but it still has errors:
Administrator@HILL /m/working/tcplex/ch8/testenum
$ cat lexer.h
namespace Lexer
{
enum Token_value{
one,two
};
extern Token_value string_value;
Token_value get_token();
}

Administrator@HILL /m/working/tcplex/ch8/testenum
$ cat lexer.cpp
#include "lexer.h"
namespace Lexer{
Token_value string_value;
}
Token_value Lexer::get_token()
{
return one;
}



Administrator@HILL /m/working/tcplex/ch8/testenum
$ g++ -c lexer.cpp
lexer.cpp:5: error: `Token_value' does not name a type

bashill.zhu@gmail.com

9/26/2008 1:49:00 PM

0

On 9?26?, ??7?03?, Pete Becker <p...@versatilecoding.com> wrote:
> On 2008-09-26 04:51:56 -0400, "bashill....@gmail.com"
> <bashill....@gmail.com> said:
>
>
>
>
>
> > bzhu@TY-PC /h/working/tcplex/ch8/testenum
> > $ cat lexer.h
> > namespace Lexer
> > {
> > enum Token_value;
> > extern Token_value string_value;
> > void get_token();
> > }
>
> > bzhu@TY-PC /h/working/tcplex/ch8/testenum
> > $ cat lexer.cpp
> > #include "lexer.h"
> > namespace Lexer{
> > enum Token_value{
> > one,two
> > };
> > }
> > void Lexer::get_token()
> > {
> > }
>
> > bzhu@TY-PC /h/working/tcplex/ch8/testenum
> > $ g++ -c lexer.cpp
> > In file included from lexer.cpp:1:
> > lexer.h:3: error: use of enum `Token_value' without previous
> > declaration
> > lexer.h:4: error: `Token_value' does not name a type
>
> You'd have the same problem if you used a forward declaration of a
> class in place of an enum. In general, you can't create objects of
> incomplete types, and "enum Token_value;" declares an incomplete type.
> The code should have the complete definition of Token_value before it's
> used.
>
> --
> Pete
> Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
> Standard C++ Library Extensions: a Tutorial and Reference
> (www.petebecker.com/tr1book)- ??????? -
>
> - ??????? -

I am wonder this reason , I just want declare a varible ,it's not
definition.

Erik Wikström

9/26/2008 3:36:00 PM

0

On 2008-09-26 15:49, bashill.zhu@gmail.com wrote:
> On 9æ??26æ?¥, ä¸?å?7æ?¶03å??, Pete Becker <p...@versatilecoding.com> wrote:
>> On 2008-09-26 04:51:56 -0400, "bashill....@gmail.com"
>> <bashill....@gmail.com> said:
>>
>>
>>
>>
>>
>> > bzhu@TY-PC /h/working/tcplex/ch8/testenum
>> > $ cat lexer.h
>> > namespace Lexer
>> > {
>> > enum Token_value;
>> > extern Token_value string_value;
>> > void get_token();
>> > }
>>
>> > bzhu@TY-PC /h/working/tcplex/ch8/testenum
>> > $ cat lexer.cpp
>> > #include "lexer.h"
>> > namespace Lexer{
>> > enum Token_value{
>> > one,two
>> > };
>> > }
>> > void Lexer::get_token()
>> > {
>> > }
>>
>> > bzhu@TY-PC /h/working/tcplex/ch8/testenum
>> > $ g++ -c lexer.cpp
>> > In file included from lexer.cpp:1:
>> > lexer.h:3: error: use of enum `Token_value' without previous
>> > declaration
>> > lexer.h:4: error: `Token_value' does not name a type
>>
>> You'd have the same problem if you used a forward declaration of a
>> class in place of an enum. In general, you can't create objects of
>> incomplete types, and "enum Token_value;" declares an incomplete type.
>> The code should have the complete definition of Token_value before it's
>> used.

Please do not quote signatures.

>
> I am wonder this reason , I just want declare a varible ,it's not
> definition.

Because the compiler does not know the size of a variable of type
Token_value until it has seen its definition. This means that you can
only declare pointers to Token_value (since the size of a pointer ti
known), but not variables.

--
Erik Wikström

Pete Becker

9/26/2008 6:19:00 PM

0

On 2008-09-26 09:41:53 -0400, "bashill.zhu@gmail.com"
<bashill.zhu@gmail.com> said:

>
> Administrator@HILL /m/working/tcplex/ch8/testenum
> $ cat lexer.cpp
> #include "lexer.h"
> namespace Lexer{
> Token_value string_value;
> }
> Token_value Lexer::get_token()
> {
> return one;
> }
>
>
>
> Administrator@HILL /m/working/tcplex/ch8/testenum
> $ g++ -c lexer.cpp
> lexer.cpp:5: error: `Token_value' does not name a type

The second mention of Token_value, as the compiler says, does not name
a type. Nor does it name anything else. Its proper name is
Lexer::Token_value.

--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)

bashill.zhu@gmail.com

9/27/2008 2:13:00 AM

0

On 9?27?, ??2?19?, Pete Becker <p...@versatilecoding.com> wrote:
> On 2008-09-26 09:41:53 -0400, "bashill....@gmail.com"
> <bashill....@gmail.com> said:
>
>
>
>
>
>
>
> > Administrator@HILL /m/working/tcplex/ch8/testenum
> > $ cat lexer.cpp
> > #include "lexer.h"
> > namespace Lexer{
> > Token_value string_value;
> > }
> > Token_value Lexer::get_token()
> > {
> > return one;
> > }
>
> > Administrator@HILL /m/working/tcplex/ch8/testenum
> > $ g++ -c lexer.cpp
> > lexer.cpp:5: error: `Token_value' does not name a type
>
> The second mention of Token_value, as the compiler says, does not name
> a type. Nor does it name anything else. Its proper name is
> Lexer::Token_value.
>
> --
> Pete
> Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
> Standard C++ Library Extensions: a Tutorial and Reference
> (www.petebecker.com/tr1book)- ??????? -
>
> - ??????? -

Thanks Pete and Eric:
I have got what I want .

$ cat lexer.h
namespace Lexer
{
enum Token_value{
one,two
};
extern Token_value string_value;
Token_value get_token();
}

bzhu@TY-PC /h/working/tcplex/ch8/testenum
$ cat lexer.cpp
#include "lexer.h"
namespace Lexer
{
Token_value string_value;
}
Lexer::Token_value Lexer::get_token()
{
return one;
}