Не удалось передать значение в конструктор

Я создаю библиотеку JSON, предназначенную для своих нужд, на основе ArduinoJSON v6.

Я пытаюсь определить StaticJsonDocument<_docSize> doc параметрическим способом, но я получаю эту ошибку и не могу найти ее причину:

/Users/guy/git/Arduino/libraries/myJSON/myJSON.cpp: In constructor 'myJSON::myJSON(char*, int, bool)':
/Users/guy/git/Arduino/libraries/myJSON/myJSON.cpp:12:28: sorry, unimplemented: use of the value of the object being constructed in a constant expression
         StaticJsonDocument<_docSize> doc;
                            ^
/Users/guy/git/Arduino/libraries/myJSON/myJSON.cpp:12:36: error: 'this' is not a constant expression
         StaticJsonDocument<_docSize> doc;
                                    ^
/Users/guy/git/Arduino/libraries/myJSON/myJSON.cpp:12:36: note: in template argument for type 'unsigned int' 
/Users/guy/git/Arduino/libraries/myJSON/myJSON.cpp:12:41: error: invalid type in declaration before ';' token
         StaticJsonDocument<_docSize> doc;
                                         ^
exit status 1
Error compiling for board NodeMCU 1.0 (ESP-12E Module).

Я вставляю только соответствующую часть кода

myJSON.h :

#ifndef myJSON_h
#define myJSON_h

#include "Arduino.h"
#include <ArduinoJson.h>
#include "FS.h"


class myJSON
{
private:
int _docSize=100;
bool useSerial;
char _filename[30];

public:
myJSON(char *filename, int docsize, bool useserial=false);
bool file_exists();//char *file=_filename);
bool file_remove();
bool format ();

};
#endif

myJSON.cpp:

#include "Arduino.h"
#include "myJSON.h"
#include "FS.h"
#include <ArduinoJson.h>


myJSON::myJSON(char *filename, int docsize, bool useserial) {

        _docSize = docsize;
        useSerial = useserial;

        StaticJsonDocument<_docSize> doc;

        if (useSerial) {
                Serial.begin(9600);
        }
        if (!SPIFFS.begin()) {
                if (useSerial) {
                        Serial.println("Failed to mount file system");
                }
        }
        else{
                sprintf(_filename,"%s",filename);
        }
}

, 👍1


1 ответ


Лучший ответ:

1

Класс, использующий <...>, называется классом шаблона. Этот класс использует форму подстановки во время компиляции для создания конкретного класса с заменой этих значений и токенов.

Именно этот конкретный класс используется для создания экземпляра вашего объекта(ов).

Однако вы пытаетесь использовать переменную времени выполнения для преобразования класса шаблона в конкретный класс, а это невозможно сделать во время компиляции - и тут в C++ нет такой вещи, как шаблон времени выполнения.

Вам необходимо переосмыслить методологию реализации.

,

спасибо за объяснение. Мое намерение состоит в том, чтобы иметь возможность определять размер буфера JSON. Есть ли способ сделать это так, как мне нужно?, @Guy . D

Я бы предложил создать объект JSON вне вашего класса и передать этот объект конструктору. Не зная, что ArduinoJSON делает с буфером и как он создается, я не могу комментировать., @Majenko

Хорошо, это был достаточно хороший обходной путь. ТНХ, @Guy . D