Compilerproblem oder unzulässige Zustandsvariablendeklaration?

Nachdem ich einige unerwartete Compiler-Ergebnisse gesehen habe, habe ich das Problem auf dieses winzige Beispiel reduziert:

Folgendes wird unter 0.4.10 in Remix kompiliert:

contract StorageMapping {

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

    mapping(bytes32 => S) public sStructs;

}

Folgendes kann jedoch nicht kompiliert werden mit „ Interner Typ ist für Zustandsvariable nicht zulässig, Bezug nehmend auf die Zuordnung. Spotchecked 3.x und 2.x. Ergebnis ist konsistent bis Version 0.2.1 (0.2.0 löst internen Compilerfehler aus ).

Einziger Unterschied in den Verträgen ist die auskommentierte Zeile.

contract StorageMapping {

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

    mapping(bytes32 => S) public sStructs;

}

Das Wichtigste scheint zu sein, der Struktur einen einfachen Wert hinzuzufügen (auch wenn er nicht benötigt wird). Da frage ich mich, was wirklich los ist.

Kennt jemand einen Grund, warum die zugeordnete Struktur mindestens einen einfachen Wert zu benötigen scheint, um Verwirrung zu vermeiden ?

Antworten (1)

Danke an Chriseth für den Hinweis, dass es nicht möglich ist, einen Getter für sStructs zusammenzustellen, wenn die Strukturen nur indizierte Typen enthalten. Da es deklariert publicist, freut sich der Compiler nicht über die Aufforderung, einen unmöglichen Getter zu erstellen.

Entfernen publicund beide Aromen und kompilieren.