#c #c 11 #googletest
#c #c 11 #googletest
Вопрос:
Я пишу Gtest для приведенного ниже Setter
метода, и я получаю ошибку при передаче метода обратного ClientReceiver
вызова из Gtest suite. Ниже приведен фрагмент кода
namespace BaseClient {
class ClientTop : public JsonClient {
public:
typedef std::function<void(const Json::Value amp; info)> ReceiverCallBack;
public:
ClientTop(std::string name, int add);
bool Setter(const std::string amp; value, ReceiverCallBack amp; listener);
};
}
Вот GTest для метода Setter. Я получаю сообщение об ошибке при вызове ClientTop_Obj->Setter(Value,ClientReceiver)
ClientReceiver
параметров
void ClientReceiver(const Json::Value amp; data){
std::cout<<"Call back receivedn";
}
TEST_F(BsrfClientBaseTest,setReceiver) {
std::string value = "Run";
bool ret = ClientTop_Obj->Setter(Value,ClientReceiver);
}
Получена ошибка
error: cannot convert ‘void(const Json::Valueamp;)’ to ‘ReceiverCallBackamp;’ {aka ‘std::function<void(const Json::Valueamp;)>amp;’}
Комментарии:
1. Удалить amp; из
ReceiverCallBack amp; listener
, на значение temp нельзя ссылаться2. можно ли также выполнить const ReceiverCallBack amp; listener, верно? Я новичок в cpp
3. Нет никакой прибыли вообще, если используется std::function<T>amp; non const или const .
Ответ №1:
Вы не можете привязать неконстантную ссылку к временной.
Рассмотрим этот пример:
bool func(int amp; l);
bool foobar() {
// It doesn't like to bind a temporary to the non-const reference.
// error: cannot bind non-const lvalue reference of type 'callback_funcamp;' {aka 'std::function<void(const intamp;)>amp;'} to an rvalue of type 'callback_func' {aka 'std::function<void(const intamp;)>'}
return func(10);
}
Вы получаете точно такое же сообщение об ошибке. Таким образом, решение состоит в том, чтобы не иметь временного, чтобы он мог привязываться к ссылке.
#include <functional>
using callback_func = std::function<void(const int amp; param)>;
class example {
public:
bool setter(callback_func amp; l);
};
void callback(const int amp; i)
{
return;
}
bool foobar() {
example e;
// It doesn't like to bind a temporary to the non-const reference.
// error: cannot bind non-const lvalue reference of type 'callback_funcamp;' {aka 'std::function<void(const intamp;)>amp;'} to an rvalue of type 'callback_func' {aka 'std::function<void(const intamp;)>'}
// return e.setter(callback_func{amp;callback});
// So, provide a non-const for it to bind to.
callback_func f{amp;callback};
return e.setter(f);
}