C ++没有名为XY的成员,我在使用枚举时遇到错误
c++ has no member named xy error i get when using an enum
我有一个名为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
之前。
- 错误:从"int"到枚举c++的转换无效
- C++:枚举:错误:应使用标识符而不是"}"
- 无法找到简单的开关大小写枚举错误
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- C++/错误:表达式必须具有整数或无作用域枚举类型
- 如何摆脱C++中的枚举不匹配错误?
- C++ 在方程中使用变量;错误:表达式必须具有整数或无作用域枚举类型及其他
- 枚举输出的值错误
- 枚举成员不是类型错误
- C++ Visual Studio 调试器枚举错误
- 比较枚举的值会给出编译器错误
- C++中一个非常简单的枚举类错误
- 如何编写一个错误结构,该结构可以包含不同的强键枚举作为错误代码
- Bjarne Stroustrup PPP - 第 9 章 演练 4 - cout 枚举错误
- 错误:以增量方式填充向量时,表达式必须具有整数或无作用域枚举类型
- c++开关枚举错误
- OpenGL 创建 glShaderObject 时出现无效枚举错误
- 从limemmicro编译lms6suite时出现枚举错误
- 试图读取枚举状态时c++枚举错误