In letzter Zeit bin ich auf ein Problem gestoßen, das irgendwie (aber nur irgendwie) für mich Sinn macht. Es basiert auf der Interpretation der Konstruktion eines temporären als Deklaration des einzelnen (!) Konstruktorarguments. Bitte schauen Sie sich das folgende Minimalbeispiel an.
%Vor%Ich habe diese Ausdrücke schon gelesen:
%Vor%Wird interpretiert (wenn es einen Standardkonstruktor gibt) als Deklaration von a. Dies ist sinnvoll und völlig in Ordnung, da Sie einfach die {} - Klammern verwenden können, um die Konstruktion explizit zu machen. Aber was ich nicht verstehe, ist:
Warum gibt es ein Problem mit der Konstruktion von bar0?
Alle Foo
s haben keinen Standardkonstruktor. Es ist also nicht sinnvoll, etwas wie Foo0(x)
als Deklaration von x
zu interpretieren.
Warum funktioniert die Konstruktion von bar1
und bar2
?
Es ist für mich offensichtlich, dass die Konstruktion von bar4
funktioniert, da ich die {} -Halterungen für alle temporären Foo
s verwende, so dass ich explizit darlege, was ich will.
Wenn es nur notwendig ist, die {} - Klammern mit nur einer der Foo
s zu verwenden, um das Problem zu lösen ... warum schlägt die Konstruktion von bar3
fehl?
Außerdem wird x deklariert, bevor ein Balken erstellt wird. Warum beschwert sich der Compiler nicht darüber?
Die letzte Frage bezieht sich auf meine letzte Codezeile. Lange Rede, kurzer Sinn: Was denkt der Compiler, dass ich ihn machen soll und wo vermisse ich das Auftreten von Shadowing?
PS: Wenn es von Interesse ist - verwende ich die gcc-4.9.2.
PPS: Ich habe das gleiche mit dem% constructor von bar
versucht und nehme drei Foo0
s als Argumente. Die gleiche Geschichte hier. Aber der Fehler sagt nichts über widersprüchliche Deklaration, sondern über die Neudefinition von x
.
Die Regel besagt, dass wenn eine Deklaration die Syntax einer Funktionsdeklaration hat, diese eine ist; Ansonsten ist es eine Variablendeklaration. Überraschende Beispiele dafür werden manchmal most-vexing-parse genannt .
%Vor% Dies ist eine Funktionsdeklaration: bar0
ist der Name, Bar
ist der Rückgabetyp und die Parametertypen sind Foo0
, Foo1
und Foo2
. Die Parameternamen sind alle x
, was illegal ist - die Namen der Funktionsparameter müssen unterschiedlich sein. Wenn Sie x
x
x
auf x
y
z
ändern, verschwindet der Fehler).
Diese Zeilen und die Objekte bar1
, bar2
und bar4
des Typs Bar
erstellen. Sie können nicht als Funktionsdeklarationen analysiert werden, da die { }
-Notation keine gültige Syntax in einer Funktionsdeklaration ist.
Daher sind Foo0{x}
usw. Ausdrücke, die die Argumente für den Konstruktor von Bar
liefern. Foo0{x}
und Foo0(x)
sind gleichwertige Möglichkeiten, einen temporären Typ Foo0
mit dem Initialisierer x
zu deklarieren.
Ich denke, das ist ein Compiler Bug; Der Teil Foo2{x}
bedeutet, dass diese Zeile keine Funktionsdeklaration sein darf; und es sieht wie eine gültige Deklaration einer Variablen bar3
aus.
x
ist ein int
; Es hat keine Methoden.
1) Foo0 (x) wird in diesem Fall als Parameter der Funktion bar0 behandelt. Hier spielt es keine Rolle, ob es einen Standardkonstruktor hat oder nicht. Es ist keine lokale Variablendeklaration und Initialisierung, sondern nur eine Parameterdeklaration in einer Funktionsdeklaration.
2) Ich vermute, das hat etwas mit dem Parsen zu tun, aber jemand korrigiert mich, wenn ich falsch liege. Die Beispiele bar1 und bar2 funktionieren, weil der Compiler weiß, dass bar1 und bar2 lokale Variablendeklarationen sind (und nicht funktionieren) Deklarationen), sobald das erste Vorkommen von {} angezeigt wird. Diese ersten Vorkommen von {} erscheinen, bevor x zweimal als Parameter der Funktion deklariert wird.
3) Die Konstruktion von bar3 schlägt fehl, weil der Compiler zuerst annimmt, dass bar3 eine Funktionsdeklaration ist. Die Funktionsdeklaration benötigt drei Parameter, die alle den Namen x haben. Offensichtlich ist das nicht korrekt.
4) Das x in der Funktionsdeklaration ist nur ein Name für den Parameter. Es ist in einem anderen Bereich als die Ganzzahl x, die Sie zuvor deklariert haben.
Tags und Links c++ most-vexing-parse temporary construction
Nun, der erste Ort, an dem Sie suchen sollten, ist die Google-Geochart-API, die Sie hier finden: Ссылка
Beachten Sie das Optionsobjekt. Geben Sie ihr eine Eigenschaft der Region "USA" und eine Auflösung der "Provinzen". Etwas wie das:
%Vor%Nun werden Sie die Zustände bekommen, aber sie werden sie nicht färben. Dazu müssen Sie für jeden Status Werte festlegen. Mach es so:
%Vor%Der erste Wert ist der Status und der zweite Wert ist der Wert, den er zum Färben trägt. Um die gewünschte Farbgebung zu erhalten, müssen Sie die Daten ein wenig massieren und dann den gewünschten Farbbereich einstellen.
%Vor%Rufen Sie das Diagrammobjekt ab und übergeben Sie das Array state_value_array an das ArrayToDataTable-Objekt, und alles sollte in Ordnung sein.
Um die Regionsfarbe für jeden Zustand als das untenstehende Bild festzulegen, müssen Sie die Farbeneigenschaft im Optionsobjekt verwenden. Versuchen Sie dies unter dem Code
%Vor%Sehen Sie sich diese jqfaq.com das hat eine funktionierende Probe
Ich habe in der Vergangenheit auch eine "politische" Karte mit der Google Geochart API erstellt. Hier ist der Code, den ich für die USA verwendet habe:
%Vor%So sieht die Karte aus:
Sie können es in Live-Action hier auf meiner Website sehen, zusammen mit anderen Geochart-Kartenbeispielen mit Codes: Ссылка
Ich möchte die Region Farbe für jeden Staat in den Vereinigten Staaten wie im Bild festlegen? ist es möglich in geochart?
Bitte leiten Sie mich dazu.
Danke und Grüße, Ranjith Kumar.