ошибка C2059: синтаксическая ошибка: «константа» из объявлений членов структуры - PullRequest
1 голос
/ 26 октября 2019

Это выглядело как простое определение класса и структуры, но получило ошибку компилятора из Visual Studio C ++ при объявлении экземпляра класса как члена структуры, но без проблем может объявить глобальные экземпляры того же класса. Ошибка компиляции в элементе структуры "Thing" (Thing thing1 (1, "1"))

Та же ошибка компиляции, если член класса объявлен как const и задан параметр в конструкторе const

class Thing
{
public:
    Thing(int addr, char* str) : theaddr(addr), name(str)      {}
    void info()             { printf("%d %s\n", theaddr, name); }
    int  read()             { /* code to read */                }
    void write(int newval)  { /* code to write newval */        }
private:    
    int  theaddr;
    char *name;
};

Thing global_thing(0,"0");  // WORKS no problem

struct Things
{
    Thing thing1(1,"1");    // ERROR on "Thing" members in struct
    Thing thing2(2,"2");
    .
    .
    .
    Thing thingN(3,"3");

}specificThings;

Ошибка компилятора "ошибка C2059: синтаксическая ошибка:" константа "в элементах 'Thing' в определении структуры.

Приведенный выше пример класса Thing придуман, чтобы продемонстрировать проблему. Что я на самом деле пытаюсь сделать, так это объявить класс для доступа к устройству SPI с адресами регистра. Система имеет несколько устройств, и некоторые из них имеют общие имена регистров (например, «config»). Идея состояла в том, чтобы структура имела члены, которые являются экземплярами класса для установки фиксированных адресов регистров. Также я хочу использовать функцию типа «info ()» для печати имен связанных регистров в целях отладки.

Идея заключалась в том, чтобы сделать что-то вроде этого:

class DeviceReg
{
    // content like the "Thing" class
};

struct
{
    DeviceReg    config(0x22,"config");
    DeviceReg    status(0x33,"status");
    // and so on...
}rfdev;

Тогда доступ к устройству может быть таким:

rfdev.config.write(0x17);
rfdev.config.info();

, и может быть какое-то другое устройство, к которому можно получить доступ, например:

tempsensor.config.write(0x55);
tempsensor.info();

Таким образом, несколько устройств могут иметь конфигурацию или статусные регистры безвынужден называть каждый регистр конфигурации на основе устройства.

Поскольку то, что я хотел сделать, очевидно, нарушает синтаксис C ++, есть ли другой способ достичь желаемого результата?

1 Ответ

1 голос
/ 26 октября 2019

Инициализаторам в классе по умолчанию для членов класса требуется синтаксис инициализатора {} или синтаксис инициализатора =. Для таких инициализаторов нет синтаксиса на основе ().

Синтаксически правильный вариант может выглядеть как

struct Things
{
    Thing thing1{ 1, "1" };
    Thing thing2{ 2, "2" };
    // ...
    Thing thingN{ 3, "3" };

} specificThings;

Однако это приведет к следующей ошибке: вы не можете использоватьстроковые литералы для инициализации char * указателей. Используйте const char * может быть?

...