C++ 在C&x2B中,“(&;)()”是什么意思+;编译器错误消息
这个错误意味着什么C++ 在C&x2B中,“(&;)()”是什么意思+;编译器错误消息,c++,g++,C++,G++,这个错误意味着什么 error: no matching function for call to `foo::bar(Qux (&)())` 我知道编译器(g++)无法将函数调用与foo成员函数匹配。我问的是关于最后额外的东西;此位:(&)() 作为参考,我的函数调用如下: // inside another member function of `foo` Qux qux(); this->bar(qux); 条码的签名为: virtual void bar(Qux&
error: no matching function for call to `foo::bar(Qux (&)())`
我知道编译器(g++)无法将函数调用与foo
成员函数匹配。我问的是关于最后额外的东西;此位:(&)(
)
作为参考,我的函数调用如下:
// inside another member function of `foo`
Qux qux();
this->bar(qux);
条码的签名为:
virtual void bar(Qux&);
编译器还表示,唯一的候选对象是:
virtual void bar(Qux&);
我的函数调用签名与我的定义签名有何不同,以及(&)(
的含义是什么?您应该使用Qux
(或者在C++11Qux{};
)中,为了避免出现。嗯,(&)(
本身并不意味着什么(&)(
只是Qux(&)(
的一部分,它意味着引用一个函数,该函数不取任何内容并返回Qux
。这是因为:
Qux qux(); //PROBLEM!
this->bar(qux);
这里的第一行没有声明对象。它声明了一个函数
在C++中搜索烦琐的解析,在这个站点上,你会看到很多主题,详细讨论这个问题。
Qux qux();
声明一个不带参数并返回Qux
的函数。
你应该写
Qux qux;
定义类型为Qux
的对象
Qux qux();
这是一个函数声明
this->bar(qux);
试图将对函数qux
的引用传递到bar
如果要默认构造qux
,请省略()
:
表达式Qux(&)(
表示对不带参数并返回Qux
的函数的引用。其他人已经解释了这一点。但是,这并不能真正解决[G+>()](/<)/Cuth>在[G++] C++编译器错误消息中的“强”>的具体细节?<强> > /P>
当编译器遇到无法解析的函数调用时,它会尝试在错误中提供尽可能多的信息。g++中这种特殊类型的错误被打印为多行,从第二行开始,编译器将列出重载解析候选项的确切签名(即通过在调用位置查找找到的函数名的已知重载)。第一行有点复杂,因为它代表实际调用:
此->条形图(qux)
。如果在错误消息中显示了这一点,则必须找出不同参数的类型,特别是this
的类型和qux
的类型
g++实现所采用的方法是编写类似于函数签名的东西,以某种方式表示调用。问题是,实际上不可能表示可以使用的限制最少的签名,因此它使用相同的语法,但含义略有不同
特别是,左值表达式参数将由对表达式类型的引用(可能是const
)表示,而右值表达式由非引用类型表示。返回您收到的错误消息:
error: no matching function for call to `foo::bar(Qux (&)())`
这意味着在调用的地方,第一个参数是一个左值表达式,表示Qux()
类型的对象(函数不是对象,但与我有关),即不带参数并按值返回Qux的函数
在这种特殊情况下,参数是一个非常量左值表达式,读取并不比解析类型本身更容易混淆,但在其他情况下,需要注意的是,这并不是真正的签名。例如,如果错误消息为:
error: no matching function for call to `foo::bar(Qux)`
为什么唯一的候选人不是一个完美的匹配者,这可能是不明显的,它不需要一个Qux
,这就是你告诉我的被通过的原因吗?除了此语法表示具有不能由左值引用绑定的右值表达式的调用之外
类似地,如果参数是常量Qux
左值,则错误为:
error: no matching function for call to `foo::bar(const Qux&)`
指示参数是一个左值表达式,但类型是const Qux
,它同样不能被非const左值引用绑定
阅读错误信息本身就是一门艺术,但它是这门技艺的重要组成部分。每当编译器使用的语言出现错误时,您都应该注意,因为这将有助于您在下次看到类似错误消息时理解问题。这不是“最麻烦的解析”。这只是“令人烦恼的解析”。这里最烦人的解析原因=>tx(U())代码>@nawaz,我不同意你的观点。我同意@Nawas的观点。然而,从那时起,它是有争议的(双向)什么是真正最烦人的解析。Scott Meyers使用了一个非常有限的初始示例,一些人说这是唯一真正最麻烦的解析,而例如,我说让我们在术语方面更加实用。毕竟这是我们的选择。@Nawaz:我不知道烦恼是可以客观量化的。如何确定tx(U())“代码>更令人烦恼,没有什么比这更令人烦恼了?”纳瓦兹最近通过电子邮件问斯科特,他是否认为这是最令人烦恼的解析,他说是的。既然他创造了这个术语,我会认为这是权威的回答。可能是“MattheUM”的复制品。但我发现,社区倾向于说问题是重复的,因为对回答者来说,问题X和问题Y之间存在联系。但通常,了解X并与之斗争的人不知道理解X的一部分就是理解Y。我认为更好的解决方案/评论会提供相关的建议阅读不透明的“副本”;如果没有下面的答案,我甚至可能不理解为什么这个问题会被视为重复。不管怎样,谢谢你的帮助,也很抱歉这个肥皂盒。我同意这很让人困惑,我希望有一天我们能有一个“结束:这里已经回答了”。没有
error: no matching function for call to `foo::bar(const Qux&)`