没有匹配的构造函数调用

时间:2020-05-06 22:08:41

标签: c++ constructor compiler-errors g++ ros

我是C ++的新手,并尝试使用ROSserial_stm32框架通过UART从ARM芯片组发布传感器数据。 原始资源来自一个用C语言编写的演示代码,该代码收集数据并通过UART以“字符串格式”发送数据。我的目标是将这些字符串发送替换为 ROS sensor_msgs 帧格式。

为此,我创建了以下头文件

false

及其关联的 C ++源文件

import numpy as np
import time
import sortedcontainers
def John(x): #x is 1D array
    n=len(x)
    rr=[]
    for i in range(n):
        rr.append(np.sum(x[i]>=x[:i+1]))
    return np.array(rr)

def John_2D(rv): #rv is 2d numpy array. rank it along axis 1!
    nr,nc=rv.shape
    rr=[]
    for i in range(nc):
        rr.append(np.sum((rv[:,:i+1]<=rv[:,i:i+1]),axis=1))
    return np.array(rr).T

def Matvei(x): #x is 1D array
    return [sorted(x[:i+1]).index(v)+1 for i, v in enumerate(x)]

def Divarkar1(x):#x is 1D array
    n = len(x)
    rr=np.ones(n,dtype=int)
    m1 = x[1:,None]>=x
    m2 = np.tri(n-1,n,k=1, dtype=bool)
    rr[1:] = (m1 & m2).sum(1)
    return rr

def Divarkar2(x):#x is 1D array
    n = len(x)
    rr=np.ones(n,dtype=int)
    m1 = x[1:,None]>=x
    m2 = np.tri(n-1,n,k=1, dtype=bool)
    (m1.astype(np.float32)[:,None,:] @ m2[:,:,None])[:,0,0]
    rr[1:]=np.einsum('ij,ij->i',m1.astype(np.float32),m2)
    return rr

def Monica1(nums): #nums is 1D array
    sortednums = sortedcontainers.SortedList()
    ranks = []
    for num in nums:
        ranks.append(sortednums.bisect_left(num))
        sortednums.add(num)
    return np.array(ranks)+1

def Monica2(nums): #nums is 1D array
    _, indexes, ranks = _augmented_mergesort(nums)
    result = [None]*len(nums)
    for i, rank_ in zip(indexes, ranks):
        result[i] = rank_
    return np.array(result)+1

def _augmented_mergesort(nums): #nums is 1D array
    # returns sorted nums, indexes of sorted nums in original nums, and corresponding ranks
    if len(nums) == 1:
        return nums, [0], [0]
    left, right = nums[:len(nums)//2], nums[len(nums)//2:] #split the array by half
    return _merge(*_augmented_mergesort(left), *_augmented_mergesort(right))

def _merge(lnums, lindexes, lranks, rnums, rindexes, rranks):
    nums, indexes, ranks = [], [], []
    i_left = i_right = 0

    def add_from_left():
        nonlocal i_left
        nums.append(lnums[i_left])
        indexes.append(lindexes[i_left])
        ranks.append(lranks[i_left])
        i_left += 1
    def add_from_right():
        nonlocal i_right
        nums.append(rnums[i_right])
        indexes.append(rindexes[i_right] + len(lnums))
        ranks.append(rranks[i_right] + i_left)
        i_right += 1

    while i_left < len(lnums) and i_right < len(rnums):
        if lnums[i_left] < rnums[i_right]:
            add_from_left()
        elif lnums[i_left] > rnums[i_right]:
            add_from_right()
        else:
            raise ValueError("Tie detected")

    if i_left < len(lnums):
        while i_left < len(lnums):
            add_from_left()
        #nums += lnums[i_left:]
        #indexes += lindexes[i_left:]
        #ranks += lranks[i_left:]
    else:
        while i_right < len(rnums):
            add_from_right()
    return nums, indexes, ranks

def rank_2D(f,nums): #f is method, nums is 2D numpy array
    result=[]
    for x in nums:
        result.append(f(x))
    return np.array(result)

x=np.random.rand(6000)
for f in [John, Matvei, Divarkar1, Divarkar2, Monica1, Monica2]:
    t1=time.time()
    rr=f(x)
    t2=time.time()
    print(f'{f.__name__+"_1D: ":16}  {(t2-t1):.3f}')
print()

x=np.random.rand(380,900)
t1=time.time()
rr=John_2D(x)
t2=time.time()
print(f'{"John_2D:":16}  {(t2-t1):.3f}')
#print(rr)

for f in [Matvei, Divarkar1, Divarkar2, Monica1, Monica2]:
    t1=time.time()
    rr=rank_2D(f,x)
    t2=time.time()
    print(f'{f.__name__+"_2D: ":16}  {(t2-t1):.3f}')
    #print(rr)

但是,我遇到以下错误:

问题1

John_1D:          0.069
Matvei_1D:        7.208
Divarkar1_1D:     0.163
Divarkar2_1D:     0.488
Monica1_1D:       0.032
Monica2_1D:       0.082

John_2D:          0.409
Matvei_2D:        49.044
Divarkar1_2D:     1.276
Divarkar2_2D:     4.065
Monica1_2D:       1.090
Monica2_2D:       3.571

问题2

/*
 * ROSserial.h
 *
 *  Created on: May 3, 2020
 *      Author: fofolevrai
 */

#ifndef INC_ROSSERIAL_H_
#define INC_ROSSERIAL_H_

#include <ros.h>
#include <geometry_msgs/Vector3.h>
#include <sensor_msgs/FluidPressure.h>
#include <sensor_msgs/Temperature.h>
#include <sensor_msgs/RelativeHumidity.h>

class ROSserial
{
private:
    //  Node handler
    ros::NodeHandle nh;
    //  Temperature data
    sensor_msgs::Temperature *lps22hb_air_temperature_t_;

public:
    //  Temperature publisher/topic
    ros::Publisher lps22hb_air_temperature_publisher_t;

    //  Class constructor
    ROSserial(void);

    //  Methods
    void Init(void);

};

#endif /* INC_ROSSERIAL_H_ */

我已经上网了(1) (2)(3)几天了,循环并重新操作代码,但仍然无法理解问题所在?我真的很感谢编译器输出的帮助吗?

感谢您的帮助,

1 个答案:

答案 0 :(得分:0)

问题1

当您不使用构造函数中的初始化器列表初始化成员变量(和基类)时,它们将被默认初始化。即

ROSserial::ROSserial(void)
{
    this->lps22hb_air_temperature_t_ = new sensor_msgs::Temperature();
}

等同于

ROSserial::ROSserial(void) : nh(),
                             lps22hb_air_temperature_t_(),
                             lps22hb_air_temperature_publisher_t()
{
    this->lps22hb_air_temperature_t_ = new sensor_msgs::Temperature();
}

来自编译器的错误消息表明lps22hb_air_temperature_publisher_t无法默认初始化。因此,需要对其进行适当的初始化。

问题2

this->lps22hb_air_temperature_publisher_t("LPS22HB_Temperature", this->lps22hb_air_temperature_t_);

该语法在构造函数的初始化列表中对初始化成员有效,但这不是设置对象值的正确语法。您可以使用

this->lps22hb_air_temperature_publisher_t = ros::Publisher("LPS22HB_Temperature", this->lps22hb_air_temperature_t_));

设置lps22hb_air_temperature_publisher_t的值。

分辨率

您可以通过以下方式解决这两个问题:

  1. 删除Init成员函数和
  2. 改为使用委托的构造函数。
class ROSserial
{
   private:
      //  Node handler
      ros::NodeHandle nh;

      //  Temperature data
      sensor_msgs::Temperature *lps22hb_air_temperature_t_;

      // Constructor, for private usage.
      ROSserial(std::string const& desc,
                sensor_msgs::Temperature* temp);

   public:

      //  Temperature publisher/topic
      ros::Publisher lps22hb_air_temperature_publisher_t;

      //  Class constructor
      ROSserial();
};

ROSserial::ROSserial(std::string const& desc,
                     sensor_msgs::Temperature* temp) :
      lps22hb_air_temperature_t_(temp),
      lps22hb_air_temperature_publisher_t(desc, temp)
{
   // Initialize ROS node
   this->nh.initNode();
   this->nh.advertise(lps22hb_air_temperature_publisher_t);
}

// Use delegating constructor.
ROSserial::ROSserial() : ROSserial("LPS22HB_Temperature", new sensor_msgs::Temperature())
{
}