使用枚举时,c ++没有名为xy的成员错误

时间:2013-11-13 11:16:20

标签: c++

我有一个名为TokenType的枚举类型,如下所示:

#ifndef TOKENTYPE_H_
#define TOKENTYPE_H_

    class TokenType{
    public:
        enum TType{
            INTEGER,
            IDENTIFIER,
            PRINT,
            READ,
            SIGN_PLUS           ='+',
            SIGN_MINUS          ='-',
            SIGN_DIV            ='/',
            SIGN_MUL            ='*',
            SIGN_LESSTHAN       ='<',
            SIGN_GREATERTHAN    ='>',
            SIGN_EQUALS         ='=',
            SIGN_DOUBLEEQUALS   ='==',
            SIGN_NOTEQUALS      ='=!=',
            SIGN_NOT            ='!',
        };
    };



#endif /* TOKENTYPE_H_ */

当我尝试编译我的类令牌时,我收到错误消息

In file included from Token.h:10:0,
                 from Token.cpp:10:
TokenType.h:25:23: warning: multi-character character constant [-Wmultichar]
TokenType.h:26:21: warning: multi-character character constant [-Wmultichar]
Token.cpp: In constructor ‘Token::Token(int, int, TokenType, int)’:
Token.cpp:15:8: error: ‘class Token’ has no member named ‘TokenType’
Token.cpp: In member function ‘void Token::setValue(int*)’:
Token.cpp:20:19: error: invalid conversion from ‘int*’ to ‘int’ [-fpermissive]
Token.cpp: In member function ‘void Token::testPrint()’:

Token.cpp:24:89: error: expected primary-expression before ‘<<’ token

类Token没有名为TokenType的成员可能是这里的罪魁祸首。

Token.h看起来像这样:

#ifndef TOKEN_H_
#define TOKEN_H_
#include "TokenType.h"


class Token {

    int line;
    int column;
    TokenType tokenType;
    int valueInt; //bei Integern muss Value gespeichert werden
    int infoKey; //der Key aus der Symtableh

public:
    Token(int line, int column, TokenType tokenType, int infoKey);
    void setValue(int* value);
    void testPrint();
    virtual ~Token();
};

#endif /* TOKEN_H_ */

最后,token.cpp看起来像这样:

#include <iostream>
using namespace std;

#include "Token.h"

Token:: Token(int line, int column, TokenType TType, int infoKey) {
    this->line = line;
    this->column = column;
    this->TokenType = TType;
    this->infoKey = infoKey;
}

void Token::setValue(int* value){
    this->valueInt = value;
}

void Token::testPrint(){
    cout << "Token: Line: " << line << " Column: " << column << " TokenType: " <<TokenType << " Infokey: " <<infoKey;
}

Token::~Token() {
    // TODO Auto-generated destructor stub
}

为什么令牌找不到tokentype?我只是c ++的初学者。 请帮帮我。

提前致谢,

亲切的问候, 凯文

5 个答案:

答案 0 :(得分:2)

编译器告诉你出了什么问题。

Token.cpp:15:8: error: ‘class Token’ has no member named ‘TokenType’

您有tokenType类型的成员TokenType

下一步:

Token.cpp: In member function ‘void Token::setValue(int*)’:
Token.cpp:20:19: error: invalid conversion from ‘int*’ to ‘int’ [-fpermissive]

您将valueInt定义为int,但您的函数将value定义为int*。这是一种类型的错过匹配。通过引用原始类型将参数传递给setter是没有意义的。所以我建议将其更改为void Token::setValue(int value)。你也可以写void Token::setValue(const int& value)

最后但并非最不重要的是,编译器会告诉您:TokenType.h:25:23: warning: multi-character character constant [-Wmultichar] 您会收到警告,因为c/c++这个表示法'c'仅用于仅限单个字符。这个:

 SIGN_DOUBLEEQUALS   ='==',
 SIGN_NOTEQUALS      ='=!=',

这不是和错误,但很可能不会像你期望的那样工作。对于单个字符,无法使用enum正确完成此操作,因为只有单个字符可以表示为适合与枚举器一起使用的数字。

答案 1 :(得分:1)

在声明中

TokenType tokenType;

在实施中

this->TokenType = TType;

查看符号注册。

您的第二行是因为valueInt类型int无法转换为int*

答案 2 :(得分:0)

是的,有3个错误,首先是类中的数据成员具有较低的't'并且您使用较高的'T'。 this->TokenType = TType;但在课堂上定义为TokenType tokenType; 第二个是this->valueInt = value;值是指针但valueInt是整数。 也许你需要this->valueInt = *value; testPrint中的第三个错误再次是对TokenType的调用,但在课堂上的错误是't'。

答案 3 :(得分:0)

'=='非常怀疑。 C ++中的字符串文字写为"=="'c'是单个字符'c'的数值。枚举是名称到数字的映射,而不是名称到字符串。您可能需要namespace TType { const std::string SIGN_DOUBLEEQUALS = "=="

此更改意味着您的所有其他错误消息都会受到影响,并且很可能会消失。

根本原因是,由于历史原因,'ab'是允许的,但没有明确定义的含义。这些原因对你来说无关紧要;他们只是留在那里 古代码工作。

答案 4 :(得分:0)

除了其他人已经解决的错误之外,还有一些改进的想法:

#ifndef TOKEN_H_
#define TOKEN_H_

class Token {
public:
    enum TokenType {
        INTEGER,
        IDENTIFIER,
        PRINT,
        READ,
        SIGN_PLUS           ='+',
        SIGN_MINUS          ='-',
        SIGN_DIV            ='/',
        SIGN_MUL            ='*',
        SIGN_LESSTHAN       ='<',
        SIGN_GREATERTHAN    ='>',
        SIGN_EQUALS         ='=',
        // SIGN_DOUBLEEQUALS   ='==',
        // SIGN_NOTEQUALS      ='=!=',
        SIGN_NOT            ='!',
    };
private:
    int const line;
    int const column;
    TokenType const tokenType;
    int valueInt; //bei Integern muss Value gespeichert werden
    int const infoKey; //der Key aus der Symtableh
public:
    Token (int const line, int const column, TokenType const tokenType, int const infoKey) :
        line(line), column(column), tokenType(tokenType), infoKey(infoKey) {}
    void setValue (int const value) { valueInt = value; }
    void testPrint () const;
    virtual ~Token ();
};

#endif /* TOKEN_H_ */
  • enum应在Token类中定义。你这样做的方法就是不能有TokenType类型的变量(你可以使用TokenType::TType类型的变量。)
  • 不需要TokenType.h。如果没有enum,您将永远不会使用Token.h值。
  • 将非常简单的方法放入听众中,只要您不必为此#include做任何事情。在这里,我为构造函数和setValue
  • 执行了此操作
  • 如果可能,请始终使用const

现在这里是Token.cpp文件:

#include <iostream>

#include "Token.h"

using namespace std;

void Token::testPrint() const {
    cout << "Token: Line: " << line << " Column: " << column << " TokenType: " << tokenType << " Infokey: " << infoKey << endl;
}

Token::~Token() {
    // TODO Auto-generated destructor stub
}

int main () {
        Token (1, 1, Token::SIGN_LESSTHAN, 77) . testPrint ();
}
  • 您必须使用Token::SIGN_LESSTHAN,因为enum现在是其成员。
  • main仅供参考。
  • 您不应将using namespace放入任何标头或任何#include之前。