Ich bemerkte, dass start1
und end1
haben mit dem auto
Typ definiert werden.
Sie nicht HABEN zu sein, aber es ist nützlich, besonders bei komplexen Templat-Typen.
Sie können jedoch keine Variable deklarieren, ohne sie in der gleichen Anweisung zu initialisieren, sonst hat sie nichts, woraus Sie einen Datentyp ableiten können. Es kann nicht eine Art aus einer anderen Aussage ableiten, wie Sie zu tun versucht.
Versuchen Sie stattdessen:
auto start1 = std::chrono::high_resolution_clock::now();
...
auto end1 = std::chrono::high_resolution_clock::now();
Wenn ich sie explizit mit dem Typ definieren std::chrono::time_point
der Ausdruck end1 - start1
gibt mir „Binäroperators‚-‘kann nicht angewendet werden ...“.
std::chrono::time_point
ist ein Templat-Typ:
template<
class Clock,
class Duration = typename Clock::duration
class time_point;
Sie sind keine Werte für die Template-Parameter bereitstellt.
std::chrono::high_resolution_clock::now()
gibt ein std::chrono::time_point<std::chrono::high_resolution_clock>
.Wenn Sie auto
nicht verwenden, müssen Sie diese vollständige Art in Ihre Variablendeklarationen angeben:
std::chrono::time_point<std::chrono::high_resolution_clock> start1 = std::chrono::high_resolution_clock::now();
...
std::chrono::time_point<std::chrono::high_resolution_clock> end1 = std::chrono::high_resolution_clock::now();
Oder, wenn Sie die Erklärungen von den Zuweisungen trennen wollen:
std::chrono::time_point<std::chrono::high_resolution_clock> start1;
std::chrono::time_point<std::chrono::high_resolution_clock> end1;
start1 = std::chrono::high_resolution_clock::now();
...
end1 = std::chrono::high_resolution_clock::now();
Sie können vereinfachen diejenigen, die ein wenig mit using
Aliase:
using hi_res_clock = std::chrono::high_resolution_clock;
using hi_res_time_point = std::chrono::time_point<std::chrono::high_resolution_clock>;
hi_res_time_point start1 = hi_res_clock::now();
...
hi_res_time_point end1 = hi_res_clock::now();
hi_res_time_point start1;
hi_res_time_point end1;
start1 = hi_res_clock::now();
...
end1 = hi_res_clock::now();
Warum kann ich mit arithmetischen Operatoren auf start1
und end1
, wenn sie mit auto
definiert sind?
Weil ihre Typen werden vollständig an den Compiler bekannt sein, und es wird, das passende operator-
zu lösen, die auf time_point
Werte arbeitet.
Umwandelt sie automatisch in etwas, das mit arithmetischen Operatoren kompatibel ist? ?
auto
ist nur eine Abkürzung, die den Compiler automatisch folgern einer Variablen Datentyp ermöglicht es, basierend auf, was zum Zeitpunkt der Kompilierung dieser Variablen zugewiesen wird.
Ich dachte auto
sollte nur die Stenografie sein, dass der Compiler zu schauen, was std::chrono::high_resolution_clock::now()
kehrt Typ ist ?!
Das ist genau das, was es tut. Sie haben auto
nicht korrekt verwendet.
['time_point'] (http://en.cppreference.com/w/cpp/chrono/time_point) ist eine Klassenvorlage. – juanchopanza
Wenn Sie 'std :: chrono :: high_resolution_clock :: time_point' verwenden, funktioniert es [gut.] (Http://coliru.stacked-crooked.com/a/3161124e7abf8f26) – jaggedSpire
@jaggedSpire Oh Gott! Danke ... muss das übersehen haben ... – daniel451