我有一个名为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 ++的初学者。 请帮帮我。
提前致谢,
亲切的问候, 凯文答案 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
之前。