エラーが次のコードの 90 行目のどこにあるかはわかっていますが、なぜこのように動作するのかわかりません。
83 string
84 getStringId(TokenType toktype)
85 {
86 map<TokenType, string>::iterator pos;
87 pos = TokenTypeMap.find(toktype);
88 string str;
89 if(pos != TokenTypeMap.end()) {
90 str = pos->first;
91 }
92 if(str.empty()) {
93 cerr << "Error: Invalid TokenType: " << toktype << endl;
94 exit(EXIT_FAILURE);
95 }
96 /* The following if block is only here for debugging */
97 if(str.length() == 1) {
98 cerr << "Error: String length == 1 :>" << str << "<:"<< endl;
99 exit(EXIT_FAILURE);
100 }
101 return str;
102 }
90 行目で、TokenType を文字列に割り当てます。TokenType は列挙型であるため、厳密な型指定のためにここで何かが発生することを期待していましたが、実際には int であるため、残念ながら警告はまったくありません。その理由は次の場所にありました。
C++ で整数を文字列に割り当てることができるのはなぜですか?
これは問題ありませんが、文字列で予想されるように、文字列が空ではなく、長さが 1 であることに気付きました。ただし、オンラインで印刷しようとすると98になります
Error: String length < 2 :><:
マーカーの間には何も印刷されていないことに注意してください >