Предположим, у меня есть этот упрощенный класс:

class A {
    this(const char* result)
    {
        this.result = result;
    }

    private:
        union{
            const char** results;
            const char* result;
        }
}

Сбой компиляции с constructor app.A.this missing initializer for const field results. Я знаю, что могу заставить его скомпилировать, если удалю квалификатор const в определении объединения, но я знаю, что члены являются константными.


Редактировать:

Когда я изменяю код на:

class A {
    this(const char* result)
    {
        this.U.result = result;
    }

    private:
        union U {
            const char** results;
            const char* result;
        }
}

Я получаю еще одну ошибку: Error: need 'this' for 'result' of type 'const(char*)'.

Кстати, я использую dmd v2.068.2

d
2
Adam Ryczkowski 29 Окт 2015 в 16:24

2 ответа

Лучший ответ

Самый простой - просто инициализировать его:

    this.results = null;
    this.result = result;

Обязательно сначала установите те, которые вы не используете, поскольку вы не хотите перезаписывать объединение нулевым значением!

Вы также можете сделать его именованным объединением:

    union A{
        const char** results;
        const char* result;
    }

    A a;

this(const char* result)
{
    this.a.result = result;
}

Затем компилятор понимает, что все они представляют собой одно поле, и запрашивает инициализацию только один раз.

Я думаю, что это, возможно, ошибка, что ваш код не работает ... похоже, что компилятор обрабатывает анонимное объединение и структурирует одинаково, тогда объединение должно быть другим, поскольку одна переменная покрывает их все.

Но обходной путь простой установки обоих работает, так что я бы сделал это сейчас. edit: на самом деле, я думаю, что предпочитаю именованный вариант объединения. Тогда немного более очевидно, что они вместе при чтении кода позже.

2
Adam D. Ruppe 29 Окт 2015 в 13:46

Я думаю, что ваш код не имеет смысла. Я предполагаю, что вы неправильно используете const.

class A {
    this(const(char)* result)
    {
        this.result = result;
    }

    private:
    union
    {
        const(const(char)*)* results; // maybe const(char)** results
        const(char)* result;
    }
}

Или вы можете просто удалить объединение:

class A {
    this(const char* result)
    {
        this.result = result;
    }

    private:
    const char* result;        
}

Потому что const char** result в любом случае изменить нельзя.

1
Kozzi11 30 Окт 2015 в 09:52