在构造函数中传递指针(*&)时出现奇怪的错误

时间:2012-05-24 13:47:00

标签: c++ pointers function-calls

我根本不是c ++大师,而且我试图在很少的试验中复制这个错误。事实是,当我用我想做的2 o 3课程做一个小程序时,没有错误。但是在主要的应用程序中,即使我尝试过很多(甚至是无意义的)解决方案,我仍然会写错误。

问题在于我有一个实例化一些资源(作为指针)的主类和一个策略模式,它构成了构造函数占用资源的不同具体行为。

在主应用程序中,init():

device = new Kinect();
controls = new Gui();

UserPositionBehaviour = new UserPositionBehaviour(device, controls);

和,行为构造函数:

UserPositionBehaviour(Kinect * device, Gui * controls);

这是错误:

src/App.cpp:30: error: no matching function for call to ‘UserPositionBehaviour::UserPositionBehaviour(Kinect*&, ofTrueTypeFont*&, ofxGui*&)’
src/UserPositionBehaviour.h:15: note: candidates are: UserPositionBehaviour::UserPositionBehaviour(Kinect*, ofxGui*, ofTrueTypeFont*)
src/UserPositionBehaviour.h:13: note:                 UserPositionBehaviour::UserPositionBehaviour(const UserPositionBehaviour&)

诶??嘿,发生什么事了?我传递指针,而不是 *& (我不知道如何阅读)

一些建议?

我试图用一个简单的案例构建复制错误只在couts上构建但是没有问题所以可能有一些错误隐藏在某处...

3 个答案:

答案 0 :(得分:3)

导致错误的代码传递三个参数(不是你认为的两个),并且它的最后两个错误顺序。您必须查看源文件的错误版本或类似内容。

检查可能正在查看的src/UserPositionBehaviour.hsrc/App.cpp的过时副本等愚蠢的内容,而不是查看编译器实际编译的版本。或者你可能正在使用预编译的标题,而且那里出了问题。

未找到的函数的错误消息通常看起来像这样。 Foo *&是类型“对Foo指针的引用”,它只是意味着你的参数表达式是左值指针到Foo。该调用可以匹配一个按值获取指针的函数,或者一个通过引用获取指针的函数。编译器也没有找到,但它必须为错误消息选择一些东西,然后编译器选择那个。如果您的调用包含参数表达式device+0而不是device,那么它将没有资格通过非const引用(因为device+0的结果是临时的),并且错误消息没有&

答案 1 :(得分:3)

根据错误消息,你使用三个参数调用构造函数,而不是两个,并且你得到的最后两个参数错误。

如果这是真正的错误消息,那么您的代码可能如下所示:

UserPositionBehaviour = new UserPositionBehaviour(device, font, controls);
//                                                        ^^^^  ^^^^^^^^

应该是:

UserPositionBehaviour = new UserPositionBehaviour(device, controls, font);
//                                                        ^^^^^^^^  ^^^^

如果您的代码确实看起来像您发布的内容,并提供该错误消息,那么真的很奇怪的事情正在发生;在这种情况下,请发布一个完整的可编辑示例,以便我们进一步调查。

您可以忽略gcc错误消息中的额外&:这是一种有点奇怪的说法,它正在寻找通过值或引用获取其参数的函数。

答案 2 :(得分:1)

如果你真的有构造函数

,代码应该编译
UserPositionBehaviour(Kinect * device, Gui * controls);

已定义,根据编译器,您不会:

  

src / UserPositionBehaviour.h:15:注意:候选人是:   UserPositionBehaviour :: UserPositionBehaviour(Kinect *,ofxGui *,   ofTrueTypeFont *)src / UserPositionBehaviour.h:13:注意:
  UserPositionBehaviour :: UserPositionBehaviour(常量   UserPositionBehaviour&安培;)

*&只是意味着你通过引用传递指针 - 即它可以在构造函数中修改。