将shared_ptr传递给函数不起作用

时间:2014-01-13 19:11:46

标签: c++ shared-ptr

我有一个名为Fan的类型, 每当我尝试写这个函数时:

void connect(shared_ptr<Fan>&);

它没有编译,这就是我在终端中得到的结果:

fanBook_example.cpp:34:22: error: no matching function for call to 
âmtm::FanBookServer::connect(std::shared_ptr<mtm::Fan>&)â
fanBook_example.cpp:34:22: note: candidate is:
In file included from Fan.h:3:0,
                 from FanBookPost.h:5,
                 from mtm_ex4.h:36,
                 from fanBook_example.cpp:16:
FanBookServer.h:39:7: note: void mtm::FanBookServer::connect(int&)

我试图传递shared_ptr作为参数,它不知道怎么做? 谢谢

编辑:

我正在尝试实现connect function,它应该以shared_ptr为例:

auto fan = std::make_shared<Fan>(1,"Bob");
server->connect(fan)

Fan类型位于Fan.h(包含),其内部命名空间名为mtm FanBookServer也在命名空间mtm。

1 个答案:

答案 0 :(得分:0)

始终首先查看第一个编译器错误(或警告),而不是 last 。编译器错误倾向于&#34;级联&#34;:编译器首先看到像

这样的东西
void connect(shared_ptr<Fan>&);

并发出类似

的错误消息
test2.cc:2:14: error: no template named 'shared_ptr'; did you mean 'std::shared_ptr'?
void connect(shared_ptr<Fan>&);
             ^~~~~~~~~~
             std::shared_ptr

根据编译器的特定版本,它可能很好地用int替换未知类型并继续运行 - 有助于尝试在一次运行中尽可能多地提供错误。 (这不是完全讽刺;在极少数情况下,程序有多个独立的语法错误,程序员会很高兴一下子被告知所有这些错误。)

无论如何,在你的情况下,编译器会到达你试图将std::shared_ptr<Fan>传递给原型为int&的函数的地方(嗯,真的是<unknown-type>&,但它对这个编译器来说是一样的),所以它会抱怨。


在不相关的说明中,您可能不需要通过引用传递shared_ptr本身 - 这只有在您计划修改来电者时才有用。 s指针本身(即,如果您将其用作out参数)。你应该使用void connect(shared_ptr<Fan> p)(如果它需要弄乱所有权)或void connect(const Fan& fan)(如果它不需要弄乱所有权)。