这个错误是什么意思?
error: no matching function for call to `foo::bar(Qux (&)())`
据我所知,编译器(g ++)无法将函数调用与foo
成员函数匹配。我特意询问最后的额外内容;这一点:(&)()
。
作为参考,我的函数调用是这样的:
// inside another member function of `foo`
Qux qux();
this->bar(qux);
bar
的签名是:
virtual void bar(Qux&);
编译器也说唯一的候选人是:
virtual void bar(Qux&);
我的函数调用签名与我的定义签名有何不同,(&)()
是什么意思?
答案 0 :(得分:7)
嗯,仅(&)()
并不意味着什么。 (&)()
只是Qux (&)()
的一部分,这意味着引用到一个不带任何内容并返回Qux
的函数。而这是因为:
Qux qux(); //PROBLEM!
this->bar(qux);
这里的第一行不声明对象。它声明了一个函数。
在C ++中搜索烦恼的解析,在这个网站上,你会看到很多关于它的话题,详细讨论这个问题。
答案 1 :(得分:3)
您应该使用Qux qux;
(或者使用C ++ 11 Qux qux{};
)来避免使用most vexing parse。
答案 2 :(得分:1)
表达式Qux (&)()
表示对不带参数的函数的引用并返回Qux
。其他人已经解释过这一点。但这并没有真正解决 [g ++] C ++编译器错误消息中(&)()
是什么意思的具体细节?
当编译器遇到无法解析的函数调用时,它试图在错误中提供尽可能多的信息。 g ++中的这种特殊类型的错误被打印为多行,从第二行开始,编译器将列出候选者的精确签名以进行重载解析(即,在调用地点通过查找找到的函数名称的已知重载)。第一行有点棘手,因为它代表了实际的调用:
this->bar(qux)
。如果在错误消息中打印出来,则必须确定不同参数的类型,特别是this
的类型和qux
的类型。
g ++实现采用的方法是编写类似函数签名的东西,以某种方式表示调用。问题是实际上不可能表示可以使用的最少限制性签名,因此它使用相同的语法,含义略有不同。
特别是, lvalue-expression 参数将由(可能const
)引用表示为表达式的类型,而 > rvalue-expression 由非引用类型表示。回到你收到的错误信息:
error: no matching function for call to `foo::bar(Qux (&)())`
这意味着在调用的地方,第一个参数是 lvalue-expression 表示对象(好吧,函数不是对象,但对我来说)键入Qux()
,这是一个不带参数的函数,并按值返回Qux
。
在这种特殊情况下,参数是非const lvalue-expression,读取并不比解析类型本身更令人困惑,但在其他情况下,重要的是要注意这不是一个签名。例如,如果错误消息是:
error: no matching function for call to `foo::bar(Qux)`
为什么唯一的候选人不是一个完美的匹配可能是不明显的,它是不是需要Qux
,这是你告诉我的正在通过的?除了此语法表示使用 rvalue-expression 的调用,该调用不能被左值 - 引用绑定。
同样,如果参数是const Qux
左值,则错误可能是:
error: no matching function for call to `foo::bar(const Qux&)`
指示参数是 lvalue-expression ,但类型为const Qux
,它再次不能被非const 左值 - 引用绑定。
阅读错误信息本身就是一门艺术,但它是这项工艺的重要组成部分。每当您使用编译器使用的语言出错时,您应该注意,因为这将有助于您在下次看到类似的错误消息时理解该问题。
答案 3 :(得分:0)
Qux qux();
声明一个不带参数的函数并返回Qux
。
你应该写
Qux qux;
定义Qux
类型的对象。
答案 4 :(得分:0)
Qux qux();
这是一个功能声明。
this->bar(qux);
这是尝试将对qux
函数的引用传递给bar
。
如果您想默认构建qux
,请忽略()
:
Qux qux;