2014-01-13 3 views
0

у меня есть тип называется Fan, всякий раз, когда я пытаюсь написать эту функцию:Передача shared_ptr к функции не работает

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&) 

im пытается передать параметр shared_ptr как параметр, и он не работает ни с какой идеей, как это сделать? спасибо

редактировать:

Я пытаюсь реализовать функцию, которая соединять предполагается принять shared_ptr, например:

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

типа вентилятора в Fan.h (включен) и его внутри пространство имен, называемое mtm , а также FanBookServer находится внутри пространства имен mtm.

+3

Как-то ваш компилятор думает, что соединение принимает int &. Проверьте все ваши объявления. – nvoigt

+0

Трудно сказать с этим много информации. Не могли бы вы дать нам код, где он называется и реализован? – CoffeeandCode

+0

@ Emad4U Похоже, что компилятор видит 'connect (int &)', но не видит 'connect (shared_ptr &)'. Это может быть вызвано скрытием имени метода, если в базовом классе «FanBookServer» объявлен 'connect (shared_ptr &)'). В этом случае вам нужно добавить 'using BaseClass :: connect;' в 'FanBookServer' или изменить имя метода connect в одном из классов. –

ответ

0

Всегда начинайте глядя на первый ошибки компилятора (или предупреждение), а не последний один. Ошибки компилятора, как правило, «каскад»: компилятор первым видит что-то вроде

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 по ссылке - это только полезно, если вы планируете изменить указатель вызывающего сам (то есть, если вы используете его как параметр out). Вероятно, вы должны использовать либо void connect(shared_ptr<Fan> p) (если ему нужно возиться с собственностью), либо void connect(const Fan& fan) (если ему не нужно возиться с собственностью).

Смежные вопросы