2012-05-24 55 views
-2

我不是一个C++大师,我试图在variuos小试验中复制这个错误。事实是,当我用2 o 3班的一个小程序做我想做的事时,没有错误。但在主要应用程序中,即使我尝试了很多(甚至是无稽之谈)解决方案,我仍然努力写出错误依然存在。构造函数中传递指针(*&)的奇怪错误

问题是,我有一个主类实例化一些资源(作为指针)和战略模式,它们将构造函数资源中的不同具体行为分开。

在主应用程序,初始化():

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但有没有问题,所以mayebe有一些错误隐藏somewhereelse ..

+3

您向我们展示的代码显示了双参数构造函数;错误信息表示有三个参数和一个参数。有些东西不对 - 也许你可以告诉我们真实的代码? –

+0

似乎没有接受两个参数的构造函数。 – hmjd

+1

是否有可能包含某个包含不同版本的UserPositionBehaviour的标题而不是您期望的标题? – molbdnilo

回答

3

根据错误消息,您使用三个参数调用构造函数,而不是两个,而最后两个错误的方法。

如果是真正的错误信息,那么你的代码可能是这样的:

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

,应该是:

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

如果你的代码确实看起来就像你贴什么,给出了这个错误信息,然后发生了一些非常奇怪的事情;在这种情况下,请发布一个完整的可编译示例,以便我们可以进一步调查。

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

+0

好的,谢谢我的大脑沸腾! – nkint

1

代码应该编译如果你真的有构造

UserPositionBehaviour(Kinect * device, Gui * controls); 

所定义,其中,根据编译程序,你不:

src/UserPositionBehaviour.h:15: note: candidates are: UserPositionBehaviour::UserPositionBehaviour(Kinect*, ofxGui*, ofTrueTypeFont*) src/UserPositionBehaviour.h:13: note:
UserPositionBehaviour::UserPositionBehaviour(const UserPositionBehaviour&)

*&只是意味着你通过口服通过引用进行交互 - 即可以在构造函数内修改它。

3

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

检查是否存在愚蠢的东西,例如过期的src/UserPositionBehaviour.hsrc/App.cpp副本,您可能正在查看而不是查看编译器实际编译的版本。或者,也许你正在使用预编译的头文件,并且出现了一些问题。

未找到函数的错误消息通常看起来像这样。 Foo *&是键入“指向Foo的指针”,它只是意味着你的参数表达式是一个左值指向Foo的指针。那叫可能匹配一个函数,它接受一个值的指针,或一个函数,通过引用接受指针。编译器还没有找到,但它必须为错误消息选择一些东西,然后你的编译器选择一个。如果您的呼叫包含的参数表达device+0而不是device,那就没有资格通过非const引用(因为device+0结果是暂时的)通过,该错误信息不会有&