错误:找不到匹配的功能

时间:2014-08-04 19:20:38

标签: c++ function class object compiler-errors

我收到一个错误说:

error: no matching function for call to 'Expression::shuntingYard(Expression&)'

当函数在名为Expression.h的头文件夹中声明时。我看不出是什么问题。我还包括了所有必要的预处理器指令。

包含以下文件:

的main.cpp

#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;
}

Expression.h

#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

如果你能指出我做错了什么,收到这个错误,我将不胜感激。

谢谢。

2 个答案:

答案 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;而不是用作参数的字符串。也就是说,应该在没有参数的情况下声明函数。