我最近在重構我的單片機c++代碼。有一個需要呼叫回呼函式的地方,那里一直報引數型別不匹配。我就很納悶,在原來的程式里,全寫一起就沒問題,現在放到類里就報這個錯。大佬們球球幫我看看哪里出了問題。
這個是出問題的代碼,在最下面的attach_ms那里出現我所說的錯誤
#pragma once
#include "mSensorData.h"
#include <Arduino.h>
#include <Ticker.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
#include <BLE2904.h>
class SensorCharacteristicBase{
BLE2902* m_p_s_2902 = new BLE2902;
// BLE2904* m_2904 = new BLE2904;
virtual void startTicker()=0;
public:
uint32_t m_SampleRate = 30;
protected:
Ticker* m_p_s_Ticker = new Ticker;
SensorDataCollectorBase* m_SensorData;
uint32_t m_SensorProperties = BLECharacteristic::PROPERTY_NOTIFY
|BLECharacteristic::PROPERTY_READ;
uint32_t m_ControlProperties = BLECharacteristic::PROPERTY_READ
|BLECharacteristic::PROPERTY_WRITE;
BLEUUID m_SensorCharacteristicUUID;
BLEUUID m_ControlCharacteristicUUID;
BLECharacteristic* m_p_SensorCharateristic;
BLECharacteristic* m_p_ControlCharateristic;
std::string m_Data;
virtual ~SensorCharacteristicBase(){};
};
/**
* @brief 心電信號的特性封裝
*
*/
class ECG_SensorCharacteristic:protected SensorCharacteristicBase
{
ECG_SensorCharacteristic(std::string sensorUUID, std::string controlUUID,int ECG_PinOUT){
m_SensorData = new ECG_SensorDataCollector(ECG_PinOUT);
m_Data = m_SensorData->getData().c_str();
m_SensorCharacteristicUUID = BLEUUID(sensorUUID);
m_ControlCharacteristicUUID = BLEUUID(controlUUID);
m_p_SensorCharateristic = &BLECharacteristic(m_SensorCharacteristicUUID,m_SensorProperties);
m_p_ControlCharateristic = &BLECharacteristic(m_ControlCharacteristicUUID,m_ControlProperties);
}
void m_TickerCallBack(){
m_p_SensorCharateristic->setValue(m_Data);
m_p_SensorCharateristic->notify();
}
//**************************出問題的地方*************************
void startTicker(){
m_p_s_Ticker->attach_ms(m_SampleRate,m_TickerCallBack);//沒有與引數串列匹配的 多載函式 "Ticker::attach_ms" 實體 -- 引數型別為: (uint32_t, void ()) -- 物件型別是: TickerC/C++(304)
}
public:
};
下面是那個Ticker.h的部分原始碼
class Ticker
{
public:
Ticker();
~Ticker();
typedef void (*callback_t)(void);//這里把void重定義了一下,按理說我用void也沒問題,因為我之前就是這么做的,很順利地通過了
typedef void (*callback_with_arg_t)(void*);
void attach(float seconds, callback_t callback)
{
_attach_ms(seconds * 1000, true, reinterpret_cast<callback_with_arg_t>(callback), 0);
}
//*******************所用到的函式在這里****************************
void attach_ms(uint32_t milliseconds, callback_t callback)
{
_attach_ms(milliseconds, true, reinterpret_cast<callback_with_arg_t>(callback), 0);
}
template<typename TArg>
void attach(float seconds, void (*callback)(TArg), TArg arg)
{
static_assert(sizeof(TArg) <= sizeof(uint32_t), "attach() callback argument size must be <= 4 bytes");
// C-cast serves two purposes:
// static_cast for smaller integer types,
// reinterpret_cast + const_cast for pointer types
uint32_t arg32 = (uint32_t)arg;
_attach_ms(seconds * 1000, true, reinterpret_cast<callback_with_arg_t>(callback), arg32);
}
template<typename TArg>
void attach_ms(uint32_t milliseconds, void (*callback)(TArg), TArg arg)
{
static_assert(sizeof(TArg) <= sizeof(uint32_t), "attach_ms() callback argument size must be <= 4 bytes");
uint32_t arg32 = (uint32_t)arg;
_attach_ms(milliseconds, true, reinterpret_cast<callback_with_arg_t>(callback), arg32);
}
void once(float seconds, callback_t callback)
{
_attach_ms(seconds * 1000, false, reinterpret_cast<callback_with_arg_t>(callback), 0);
}
void once_ms(uint32_t milliseconds, callback_t callback)
{
_attach_ms(milliseconds, false, reinterpret_cast<callback_with_arg_t>(callback), 0);
}
template<typename TArg>
void once(float seconds, void (*callback)(TArg), TArg arg)
{
static_assert(sizeof(TArg) <= sizeof(uint32_t), "attach() callback argument size must be <= 4 bytes");
uint32_t arg32 = (uint32_t)(arg);
_attach_ms(seconds * 1000, false, reinterpret_cast<callback_with_arg_t>(callback), arg32);
}
template<typename TArg>
void once_ms(uint32_t milliseconds, void (*callback)(TArg), TArg arg)
{
static_assert(sizeof(TArg) <= sizeof(uint32_t), "attach_ms() callback argument size must be <= 4 bytes");
uint32_t arg32 = (uint32_t)(arg);
_attach_ms(milliseconds, false, reinterpret_cast<callback_with_arg_t>(callback), arg32);
}
void detach();
bool active();
protected:
void _attach_ms(uint32_t milliseconds, bool repeat, callback_with_arg_t callback, uint32_t arg);
protected:
esp_timer_handle_t _timer;
};
uj5u.com熱心網友回復:
那個是類非靜態成員函式和你的定義不一致因為每個類的非靜態成員函式,都有一個隱藏的引數,this
uj5u.com熱心網友回復:
所以應該怎么改
我c++兩天速成的hhh,好多細節不清楚,是需要用哪個關鍵字去定義callback函式呀,麻煩大佬指示一下
uj5u.com熱心網友回復:
改成靜態函式試試轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/162064.html
標籤:C++ 語言
