C ++没有名为XY的成员,我在使用枚举时遇到错误

c++ has no member named xy error i get when using an enum

本文关键字:枚举 错误 遇到 成员 XY      更新时间:2023-10-16

我有一个名为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_ */

最后令牌.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
}

为什么令牌找不到令牌类型? 我只是 C++ 的初学者。请帮助我。

提前感谢,

亲切问候凯文

编译器

会告诉你出了什么问题。

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正确完成此操作,因为只有单个字符可以表示为适合与枚举器一起使用的数字。

在声明中

TokenType tokenType;

实施中

this->TokenType = TType;

查看符号寄存器。

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

是的,有 3 个错误,首先是类中的数据成员使用较低的"t",而您使用大写的"T"。 this->TokenType = TType;但在类中它被定义为TokenType tokenType;第二个是this->valueInt = value;值是指针,但值Int是整数。也许你需要this->valueInt = *value;testPrint 中的第三个错误再次是对 TokenType 的调用,但在类中是较低的"t"。

'=='

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

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

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

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

#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_ */
  • 应在Token类中定义enum。您这样做的方式不能有 TokenType 类型的变量(您可以有一个 TokenType::TType 类型)。
  • 没有必要
  • TokenType.h.如果没有 Token.h,您将永远不会使用enum值。
  • 将非常简单的方法放入听器中,只要您不必为此#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之前。