计算器.cpp:48:24:错误:从 'char' 到 'const char*' 的转换无效 [-允许]

Calculator.cpp:48:24: error: invalid conversion from 'char' to 'const char*' [-fpermissive]

本文关键字:char 无效 转换 允许 const cpp 计算器 错误      更新时间:2023-10-16

这是我的披露:我正在做一个学校项目,我使用链接堆栈来实现后缀计算器。

我今天的问题是,我在我的代码中得到一个奇怪的(对我来说)错误,我似乎无法绕过。随着时间的推移,我能弄清楚的逻辑是,我需要做的是这些语法上的事情(我认为通过练习,这将是自然而然的)。

无论如何,我想知道是什么导致这个错误,为什么。根据我的研究,它与字符串和字符比较有关,但这是我知识的极限。

更新:我在代码中出现的错误旁边添加了一些星号

我在学校的编译器上得到的错误块如下:

In file included from Calculator.h:35:0,
                 from CalculatorMain.cpp:6:
Calculator.cpp: In member function 'void Calculator::performOp(const string&)':
Calculator.cpp:48:24: error: invalid conversion from 'char' to 'const char*' [-fpermissive]
/opt/csw/lib/gcc/i386-pc-solaris2.10/4.6.3/../../../../include/c++/4.6.3/bits/basic_string.tcc:214:5: error:   initializing argument 1 of 'std::basic_string<_CharT,    aits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]' [-fpermissive]
Calculator.cpp:52:30: error: invalid conversion from 'char' to 'const char*' [-fpermissive]
/opt/csw/lib/gcc/i386-pc-solaris2.10/4.6.3/../../../../include/c++/4.6.3/bits/basic_string.tcc:214:5: error:   initializing argument 1 of 'std::basic_string<_CharT,    aits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]' [-fpermissive]
Calculator.cpp:53:101: error: invalid conversion from 'char' to 'const char*' [-fpermissive]
/opt/csw/lib/gcc/i386-pc-solaris2.10/4.6.3/../../../../include/c++/4.6.3/bits/basic_string.tcc:214:5: error:   initializing argument 1 of 'std::basic_string<_CharT,    aits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]' [-fpermissive]
Calculator.cpp:57:27: error: invalid conversion from 'char' to 'const char*' [-fpermissive]
/opt/csw/lib/gcc/i386-pc-solaris2.10/4.6.3/../../../../include/c++/4.6.3/bits/basic_string.tcc:214:5: error:   initializing argument 1 of 'std::basic_string<_CharT,    aits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]' [-fpermissive]
Calculator.cpp:60:23: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
Calculator.cpp:61:27: error: invalid conversion from 'char' to 'const char*' [-fpermissive]
/opt/csw/lib/gcc/i386-pc-solaris2.10/4.6.3/../../../../include/c++/4.6.3/bits/basic_string.tcc:214:5: error:   initializing argument 1 of 'std::basic_string<_CharT,    aits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]' [-fpermissive]
Calculator.cpp:64:23: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]

我的代码在我的计算器类(计算器。cpp。头文件是独立的):

** @file Calculator.cpp */
#include <string>
#include <cassert>       
#include "Calculator.h"  
Calculator::Calculator(){
}  // end default constructor
bool Calculator::isOperator(const string& newEntry) {
    string ops[] = {"-", "+", "/", "*"};
    for (int i = 0; i < 4; i++) {
        if (newEntry == ops[i]) {
            return true;
        }
    }
    return false;
}
bool Calculator::isOperand(const string& newEntry) {
    if (!isOperator(newEntry) && newEntry != "(" && newEntry != ")") {
       return true;
    }
    return false;
}
int Calculator::compareOps(const string& op1,const string& op2) {
    if ((op1 == "*" || op1 == "/") && (op2 == "+" || op2 == "-")) {
        return -1; 
    }
    else if ((op1 == "+" || op1 == "-") && (op2 == "*" || op2 == "/")) {
        return 1; 
    }
    return 0;
}
void Calculator::performOp(const string& userExpression) { 
    string temp = userExpression;
    int i = 0;
    cout << "Error log: User expression is now " << temp << endl;
    while(temp[i] > temp.length()) {
        cout << "Error log: begin while loop" << endl;
        **if (isOperand(temp[i])) {**
            postfixString += temp[i];
        }
        else if **(isOperator(temp[i]))** {
            **while (!infixStack.isEmpty() && infixStack.peek() != "(" && compareOps(infixStack.peek(), temp[i]) <= 0) {**
                postfixString += infixStack.peek();
                infixStack.pop();
            }// end while
            infixStack.push(temp[i]);
        }
        **else if (temp[i] == "(") {**
            infixStack.push(temp[i]);
        }
        **else if (temp[i] == ")") {**
            while (!infixStack.isEmpty()) {
                if (infixStack.peek() == "(") {
                    infixStack.pop();
                    break;
                }
                postfixString += infixStack.peek();
                infixStack.pop();
            }//end while
        }//end last else if
        i++;
    }//end while
    while(!infixStack.isEmpty()) {
        postfixString += infixStack.peek();
        infixStack.pop();
    }
    cout << "The Postfix form of your expression is: " << postfixString << endl;
}

下面是测试这个类的文件:

#include <iostream>
#include <string>
#include "Calculator.h"
using namespace std;
int main()
{
    Calculator aCalculator;
    string userString = "1+1";
    cout << "Testing the Link-Based Stack:" << endl;
    aCalculator.performOp(userString);
   return 0;
}  // end main

您的一些函数期望字符串,但您正在传递单个字符。例如,isOperator应该是:

bool Calculator::isOperator(char newEntry) {
    char ops[] = {'-', '+', '/', '*'};
    for (int i = 0; i < 4; i++) {
        if (newEntry == ops[i]) {
            return true;
        }
    }
    return false;
}

因为你这样调用它:isOperator(temp[i])temp[i]返回一个字符,而不是字符串。

还有很多地方你可以混合使用字符和字符串