Как передать обратный вызов для выполнения Gtest на c

#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);
}