【问题标题】:c++ has no member named xy error i get when using an enumc++ has no member named xy 使用枚举时我得到的错误
【发布时间】:2013-11-25 23:11:22
【问题描述】:

我有一个名为 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
}

为什么token找不到tokentype?我只是 C++ 的初学者。 请帮帮我。

提前致谢,

亲切的问候, 凯文

【问题讨论】:

    标签: c++


    【解决方案1】:

    编译器会告诉你哪里出了问题。

    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*。这是一种类型不匹配。通过引用原始类型将参数传递给设置器是没有意义的。所以我建议把它改成void Token::setValue(int value)。你也可以写void Token::setValue(const int&amp; value)

    最后,编译器告诉你:TokenType.h:25:23: warning: multi-character character constant [-Wmultichar] 您会收到警告,因为在c/c++ 中,'c' 表示仅用于单个字符。这个:

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

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

    【讨论】:

    • 不是错误,是警告。它可以工作,但不能。 C++98 中的enum 具有实现定义的底层类型。
    • @ForEveR 哦,我没有改变它。我的错。我知道这是一个警告,但这不会按预期工作,即使 if 会编译。已编辑。感谢您指出!它实际上是 IHMO,代码的最大问题,即使只是一个警告。
    • 为什么它不能按预期工作?所有这些多字符文字都是整数,并且基础类型不固定的枚举应该具有基础类型整数类型,它可以处理所有枚举值。如果没有这样的类型 - 程序格式错误。
    • @ForEveR 我并不是说它对 OP 肯定不起作用。但我有强烈的感觉,他想将它与一些解析的数据进行比较。 '==' 会有什么价值?以及如何将它与从文件中读取的字符串进行比较?我只是认为这个想法会引起麻烦。我认为它不会像 OP 认为的那样工作,因为他允许他的令牌是多字符的,并使用为单个字符设计的类型。他可能需要将令牌读取为字符串,将其与"==" 进行比较,并将'==' 分配给它。我觉得这很麻烦,而且我很确定这不是他们所期望的。也许我错了。
    【解决方案2】:

    在声明中

    TokenType tokenType;
    

    实施中

    this->TokenType = TType;
    

    查看符号寄存器。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

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

          #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。如果没有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 之前。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-05-14
            • 2022-10-22
            • 1970-01-01
            • 1970-01-01
            • 2018-10-18
            • 1970-01-01
            • 2020-09-22
            • 1970-01-01
            相关资源
            最近更新 更多