Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C&x2B中,“(&;)()”是什么意思+;编译器错误消息_C++_G++ - Fatal编程技术网

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++11
Qux{};
)中,为了避免出现。

嗯,
(&)(
本身并不意味着什么
(&)(
只是
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&)`