-1

Массив std::array является членом класса. Нужно задавать его размер через конструктор. С этим вроде разобрался:

Com.h:

#include <array>

template <uint8_t data_size> class Com { public: Com(uint8_t type); void write(); private: uint8_t _type; std::array<uint32_t, data_size> _data; };

Com.cpp:

#include "com.h"

template <uint8_t data_size> Com<data_size>::Com(uint8_t type) { _type = type; };

Проблема: как реализовать методы класса в cpp файле? Как для обычного класса void Com::write(){} не работает: error: 'Com' is not a class, namespace, or enumeration

Желательно обойтись без std::vector, нужен статический массив.

Если делать так:

template <uint8_t data_size>
void Com<data_size>::write()
{
}

то уже линкер ругается: Undefined symbol Com<(unsigned char)8>::Com(unsigned char) (referred from BUILD/source/main.o).

UPD: линкер ругается как раз таки на реализацию конструктора в cpp файле, а не метода.

Sergio
  • 11
Sergio
  • 1
  • 1
    Вы, ставя метку "шаблоны", читали ее описание? Ну и где в вашем вопросе шаблоны проектирования? Перед тем, как что-то писать - надо почитать, а вы даже первую страницу сайта не прочли (иначе бы уже получили бронзовую медаль, которой у вас нет :)). – Harry Oct 27 '20 at 05:45
  • 1
    Не стоит выносить определения шаблонных классов и функций в cpp файлы – Andrej Levkovitch Oct 27 '20 at 06:21
  • Размер std::array не может быть задан через конструктор, это параметр времени компиляции. – user7860670 Oct 27 '20 at 06:56

1 Answers1

0

Как обычно:

template <uint8_t data_size>
void Com<data_size>::write()
{
    ....
};
Harry
  • 221,325