查看: 98|回复: 4

[未解决] 在Arduino中使用的C++支持类模板吗?

[复制链接]
  • TA的每日心情
    开心
    2020-6-30 23:15
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2020-6-29 22:15 | 显示全部楼层 |阅读模式
    在Arduino中使用的C++是什么版本,支持模板吗?
    写如下代码:
    template<typename T>
    class bmi160dev
    {
    private:
      #code省略;
    public:
      #code省略;
    };
    实现上面的类,编译后得到以下错误:
    sketch\intelligence_cup_v0.2.ino.cpp.o.literal._Z5setupv+0x38): undefined reference to `bmi160dev<i2cMaster>::bmi160_init(bmi160_dev<i2cMaster>*)'

    sketch\intelligence_cup_v0.2.ino.cpp.o: In function `setup()':

    d:\Espressif\Arduino-workspace\intelligence_cup_v0.2/intelligence_cup_v0.2.ino:35: undefined reference to `bmi160dev<i2cMaster>::bmi160_init(bmi160_dev<i2cMaster>*)'



    sketch\intelligence_cup_v0.2.ino.cpp.o: In function `loop()':

    d:\Espressif\Arduino-workspace\intelligence_cup_v0.2/intelligence_cup_v0.2.ino:146: undefined reference to `bmi160dev<i2cMaster>::bmi160_get_sensor_data(unsigned char, bmi160_sensor_data*, bmi160_sensor_data*, bmi160_dev<i2cMaster> const*)'

    类似上面的错误是什么原因?
  • TA的每日心情
    开心
    2020-7-1 21:46
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    发表于 2020-6-29 23:49 | 显示全部楼层
    支持的,Arduino里面很多库的源代码就是模板类,比如ArduinoJSON
  • TA的每日心情
    开心
    2020-6-30 23:15
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2020-6-30 00:20 | 显示全部楼层
    以下代码实测确实支持模板,但是不明白为什么一楼代码为何编译错误。

    #include "Arduino.h"
    #include <HardwareSerial.h>
    template<class numType>
    class Compare{
    public:
    Compare(numType a,numType b){
    this->a=a;
    this->b=b;
    }
    numType max( );
    private:
    numType a;
    numType b;
    };
    template<class numType>
    numType Compare<numType>::max( ){
    return a > b? a: b;
    }
    Compare<int> cmp(12,3);
    void setup() {
      // put your setup code here, to run once:
      int m;
      
      Serial.begin(115200);
      m = cmp.max();
      Serial.println(m);
    }

    void loop() {
      // put your main code here, to run repeatedly:

    }
  • TA的每日心情
    开心
    2020-6-30 23:15
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2020-7-2 22:21 | 显示全部楼层

    模板做另外一个模板的参数

    按照如下方式可以解决问题。。模板做另外一个模板的参数。
    template<typename U>
    struct  bmi160_dev
    {
    #code...
    }
    template<typename T>
    class bmi160dev
    {
    private:
    int8_t get_foc_status(uint8_t *foc_status, struct bmi160_dev<T> const *dev);
    #other code...
    }
    template<typename T>
    void bmi160dev<T>::bmi160_int_regs_print(const bmi160_dev<T>  *dev)
    {
    #code...
    }

    该用户从未签到

    发表于 2020-7-2 22:55 | 显示全部楼层

    直接就可以使用类模板,为什么要搞那么复杂??? 123.png
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    5分钟带你快速了解新一代开发板:M5STACK
    5分钟带你快速了解新一代
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    创客火首发无人机编队套装,开启不一样的人工智能教育
    创客火首发无人机编队套装
    2017年国务院发布《新一代人工智能发展规划》,提出要广泛开展人工智能科普活动,在中
    Arduino如何输出ASCii 的控制字符串ENQ为05H
    Arduino如何输出ASCii 的
    程序段 void loop() { Serial.print("ENQ1234"); } Arduino会转换成ASCii码发送
    点阵时钟 验证报错 求大神帮个忙
    点阵时钟 验证报错 求大神
    智慧食堂,让吃饭有着不一样的体验!
    智慧食堂,让吃饭有着不一
    以后凭脸吃饭啦!不在乎颜值、不管是谁,小编告诉你:只要“脸”就可以! “吃饭5分
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表