C++ C++;为什么没有匹配的函数调用会出现这种奇怪的错误

C++ C++;为什么没有匹配的函数调用会出现这种奇怪的错误,c++,c++11,compiler-errors,C++,C++11,Compiler Errors,我有以下代码段: 一元表达式.h: \ifndef一元表达式_ #定义一元表达式_ #包括“Expression.h” 类UnaryExpression:公共表达式{ 私人: 令牌op; 表达实验; 受保护的: 地图范围; 公众: 一元表达式(std::map和scope、Token和op、Expression和exp); 虚~UnaryExpression(); void evaluate(); float getReturnValue(); }; #endif/*一元表达式*/ Unary

我有以下代码段:

一元表达式.h:

\ifndef一元表达式_
#定义一元表达式_
#包括“Expression.h”
类UnaryExpression:公共表达式{
私人:
令牌op;
表达实验;
受保护的:
地图范围;
公众:
一元表达式(std::map和scope、Token和op、Expression和exp);
虚~UnaryExpression();
void evaluate();
float getReturnValue();
};
#endif/*一元表达式*/
UnaryExpression.cpp:

#包括“UnaryExpression.h”
UnaryExpression::UnaryExpression(标准::映射和作用域、标记和操作、表达式和表达式):表达式(作用域){
这个->op=op;
这个->exp=exp;
}
UnaryExpression::~UnaryExpression(){}
void UnaryExpression::evaluate(){}
float UnaryExpression::getReturnValue(){
返回此->返回结果;
}
我不断地得到一个错误,但一旦我删除
Expression从构造函数和私有变量来看,错误似乎消失了,我不确定为什么会发生这种情况:

g++ -O0 -g3 -Wall -c -fmessage-length=0 -o "src\\UnaryExpression.o" "..\\src\\UnaryExpression.cpp" 

..\src\UnaryExpression.cpp: In constructor 'UnaryExpression::UnaryExpression(std::map<std::__cxx11::basic_string<char>, float>&, Token&, Expression&)':
..\src\UnaryExpression.cpp:10:117: error: no matching function for call to 'Expression::Expression()'
   10 | UnaryExpression::UnaryExpression(std::map<std::string, float> &scope, Token& op, Expression& exp) : Expression(scope) {
      |                                                                                                                     ^
In file included from ..\src\UnaryExpression.h:11,
                 from ..\src\UnaryExpression.cpp:8:
..\src\Expression.h:18:2: note: candidate: 'Expression::Expression(std::map<std::__cxx11::basic_string<char>, float>&)'
   18 |  Expression(std::map<std::string, float> &scope);
      |  ^~~~~~~~~~
..\src\Expression.h:18:2: note:   candidate expects 1 argument, 0 provided
..\src\Expression.h:13:7: note: candidate: 'Expression::Expression(const Expression&)'
   13 | class Expression : public Statement {
      |       ^~~~~~~~~~
..\src\Expression.h:13:7: note:   candidate expects 1 argument, 0 provided

Build Failed. 1 errors, 0 warnings. (took 1s.89ms)

g++-O0-g3-Wall-c-fmessage length=0-o“src\\UnaryExpression.o”“..\\src\\UnaryExpression.cpp”
..\src\UnaryExpression.cpp:在构造函数“UnaryExpression::UnaryExpression(std::map&,Token&,Expression&)”中:
..\src\UnaryExpression.cpp:10:117:错误:调用“Expression::Expression()”时没有匹配的函数
10 | UnaryExpression::UnaryExpression(标准::映射和作用域、标记和操作、表达式和表达式):表达式(作用域){
|                                                                                                                     ^
在..\src\UnaryExpression.h:11中包含的文件中,
from..\src\UnaryExpression.cpp:8:
..\src\Expression.h:18:2:注:候选:“Expression::Expression(std::map&)”
18 |表达式(标准::映射和范围);
|  ^~~~~~~~~~
..\src\Expression.h:18:2:注意:候选者需要1个参数,提供0个参数
..\src\Expression.h:13:7:注意:候选:“Expression::Expression(const Expression&)”
13 |类别表达:公开声明{
|       ^~~~~~~~~~
..\src\Expression.h:13:7:注意:候选者需要1个参数,提供0个参数
生成失败。1个错误,0个警告。(耗时1s.89毫秒)
以下是表达式h的定义,仅供参考:

#ifndef表达式_
#定义表达式_
#包括“Statement.h”
类表达式:公共声明{
受保护的:
地图范围;
浮动返回结果;
公众:
表达式(标准::映射和范围);
虚拟表达式();
虚空评估();
虚拟浮点getReturnValue();
};
#endif/*表达式*/

class语句类似于Expression,它只有一个虚拟方法
void evaluate()
和一个作用域。初始化表达式时,我当然会将作用域传递给父语句类。

出于好奇:
UnaryExpression
中的成员
scope
,是否是复制/粘贴错误?基类
Expression
中已经有这样的成员
UnaryExpression
有一个字段
Expres你的构造函数没有初始化。@al3c正确!:-)(我必须承认,g++的抱怨在某种程度上误导了我。)一个很好的例子,在构造函数的主体中,初始值设定项应该优先于赋值项……您注意到我在链接中修复了@al3c提到的问题了吗?您只需将参数
exp
传递到
this->exp
的构造函数中(就像我那样)。如果不这样做,则默认构造
UnaryExpression::exp
。(每个成员都是显式或隐式构造的。)这就是您遇到的错误。(IMHO,g++对此的抱怨有点误导。)是的。这是被调用的,并且是最好的成员构造类型,不要混淆。这有点棘手,因为member和arg.被称为相同的,并且它适用于所有这一切,因为在成员初始值设定项列表中,只需要成员,但在成员初始值设定项参数中,构造函数参数掩盖了成员。这就是为什么
exp(exp)
有效的秘密: