我收到一个错误说:
error: no matching function for call to 'Expression::shuntingYard(Expression&)'
当函数在名为Expression.h的头文件夹中声明时。我看不出是什么问题。我还包括了所有必要的预处理器指令。
包含以下文件:
#include <iostream>
#include "Expression.h"
using namespace std;
int main()
{
Expression expr("2 * (3 + 1)");
//Set x = 5
//expr.instantiateVariable('x',5);
//Set y = 3
//expr.instantiateVariable('y',3);
cout << "Answer: " << expr.shuntingYard(expr) << endl;
}
#ifndef EXPRESSION_H
#define EXPRESSION_H
#include <string>
#include <iostream>
using namespace std;
class Expression
{
private:
string expression;
public:
Expression(string expr);
~Expression();
void instantiateVariable(char name, int value);
//Function to calculate the postFix string made by the ShuntingYard function
int evaluate(string, int, int);
//Function to convert infix expression to postfix
string shuntingYard(string);
//Other
int higherPrecedence(char operator1, char operator2);
bool IsOperator(char C);
bool IsOperand(char C);
};
#endif
如果你能指出我做错了什么,收到这个错误,我将不胜感激。
谢谢。
答案 0 :(得分:3)
声明的函数shuntingYard
按值string
获取,而不是Expression
参考。
作为旁注,将operator string()
添加到class Expression
可以解决您的问题:
operator string() const
{
return expression;
}
<强> SUPPLAMENTAL 强>
这也是一个选项(我个人更喜欢):
operator string&() const
{
return expression;
}
在这种情况下,删除const
将允许您在外部更改expression
成员变量。
答案 1 :(得分:0)
在类定义中,您声明了函数
string shuntingYard(string);
具有std::string
但是在main中,您调用具有相同名称的函数,但传递类型为Expression
cout << "Answer: " << expr.shuntingYard(expr) << endl;
类型Expression
的对象没有转换为类定义std::string
中可以隐式调用的对象的转换函数。
因此编译器没有看到被调用函数的声明并发出错误。
这是错误的类设计的结果。函数shuntingYard
必须使用数据成员string expression;
而不是用作参数的字符串。也就是说,应该在没有参数的情况下声明函数。