2

次のような 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 ‘&lt;<’ token

class 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 ++の初心者です。私を助けてください。

前もって感謝します、

よろしく、 ケビン

4

5 に答える 5

2
于 2013-11-13T11:27:40.953 に答える
0

はい、3 つのエラーがあります。1 つ目は、クラスのデータ メンバーが下位の 't' であり、上位の 'T' で使用していることです。this->TokenType = TType;しかし、クラスでは次のように定義されていますTokenType tokenType; 。2番目のthis->valueInt = value; 値はポインターですが、valueIntは整数です。多分あなたが必要ですthis->valueInt = *value; testPrint の 3 番目のエラーは再び呼び出しですTokenTypeが、クラスでは下位の 't' を使用しています。

于 2013-11-13T11:29:20.377 に答える
0

'=='非常に疑わしいです。C++ の文字列リテラルは"==". 'c'単一文字「c」の数値です。列挙型は、名前から文字列へのマッピングではなく、名前から番号へのマッピングです。あなたはおそらくしたいですnamespace TType { const std::string SIGN_DOUBLEEQUALS = "=="

この変更は、他のすべてのエラー メッセージが影響を受け、表示されなくなる可能性があることを意味します。

根本的な原因は、歴史的な理由から、'ab'許可されているものの、明確な意味が定義されていないことです。これらの理由は、実際には問題ではありません。それらは、古いコードを機能させ続けるためにそこにあるだけです。

于 2013-11-13T15:33:36.960 に答える