我根本不是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上构建但是没有问题所以可能有一些错误隐藏在某处...
答案 0 :(得分:3)
导致错误的代码传递三个参数(不是你认为的两个),并且它的最后两个错误顺序。您必须查看源文件的错误版本或类似内容。
检查可能正在查看的src/UserPositionBehaviour.h
和src/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&安培;)
*&
只是意味着你通过引用传递指针 - 即它可以在构造函数中修改。