C++ 从堆栈读取 char 到字符串结果 "Unrecognized enum"

C++ reading char from stack to string results in "Unrecognized enum"

我是 C++ 的新手,一定有我遗漏的东西。我的代码是这样的:

std::stack<char> operators;
std::stringstream stream;
stream.str("5.2 + 3");

while(stream.peek() != -1){
    char token = static_cast<char>(stream.get());
    //some code checking if the token is valid
    operators.push(token);
    auto tmp = operators.top(); //there I can still see the char (for example '+')
    std::string tmpStr = "" + tmp; //But when put into string, there is "Unrecognized enum"
}

变量tmpStr填充"Unrecognized enum"而不是tmp.

的内容

我找不到任何解决方案,但我相信它一定很简单。 感谢您的帮助。

编辑: 因此,如果我使用 tmpStr.push_back(tmp) 它会起作用。但后来我这样使用它:

std::queue<std::string> outQueue;
outQueue.push(" " + operators.top());
//some code
std::string result = "";
while(!outQueue.empty()){
    result.append(outQueue.front() + " ");
    outQueue.pop();
}
//result then has for example something like "5.2 own enum 3 own enum"

operators 堆栈附加的位置上,有 "own enum" 而不是实际保存在那里的内容。

停止"" + something

这是 C++,它不会神奇地从字符串文字中生成字符串对象。

如果上面的代码实际编译,这意味着 somethign 是某种整数类型,你正在获取 "" 指向的位置的堆栈指针 (const char*) 并添加指针偏移量到那个。在下一个 NULL 之前,您不会读取一些 随机数据

如果您想将某些内容转换为字符串,您需要对其进行转换。标准方法是通过输出流运算符。

enum OP
{
    OP_ADD,
    OP_SUB,
    OP_DIV,
    OP_MUL
};

std::ostream& operator << (std::ostream& os, OP op)
{
    switch (op)
    {
        case OP_ADD:
            os << "ADD";
            break;
        case OP_SUB:
            os << "SUB";
            break;
        case OP_DIV:
            os << "DIV";
            break;
        case OP_MUL:
            os << "MUL";
            break;
        default:
            throw std::logic_error("Invalid OP");
    }
}

然后可以这样使用:

OP op = OP_ADD;
std::stringstream buff;
buff << op;
std::string sop = buff.str();

但由于上面的代码很愚蠢,我有一个 shorthand 用于对象到字符串的转换:

template <typename T>
std::string to_string(T value)
{
    std::stringstream buff;
    buff << value;
    return buff.str();
}

然后可以这样使用:

OP op = OP_ADD;
std::string sop = to_string(op);