Проблема с компилятором или неправильное объявление переменной состояния?

Увидев некоторые неожиданные результаты компиляции, я сократил проблему до этого крошечного примера:

Следующее компилируется под 0.4.10 в Remix:

contract StorageMapping {

    struct S {
        mapping(bytes32 => uint) m;
        bytes32[] b;
        uint x;
    }

    mapping(bytes32 => S) public sStructs;

}

Однако следующее не удается скомпилировать с « Внутренний тип не разрешен для переменной состояния, ссылаясь на сопоставление. Выборочная проверка 3.x и 2.x. Результат соответствует версии 0.2.1 (0.2.0 выдает внутреннюю ошибку компилятора ).

Отличие контрактов только в том, что одна строка закомментирована.

contract StorageMapping {

    struct S {
        mapping(bytes32 => uint) m;
        bytes32[] b;
        // uint x;
    }

    mapping(bytes32 => S) public sStructs;

}

Кажется важным добавить в структуру простое значение (даже если оно не нужно). Это заставляет меня задаться вопросом, что на самом деле происходит.

Кто-нибудь знает причину, по которой отображаемой структуре требуется хотя бы одно простое значение, чтобы избежать путаницы ?

Ответы (1)

Спасибо chriseth за указание на то, что невозможно собрать геттер для sStructs, когда структуры содержат только индексированные типы. Поскольку он объявлен public, компилятору не понравится, что его попросят создать невозможный геттер.

Удалите publicи оба аромата и скомпилируйте.