diff --git a/README.md b/README.md index acc16eace6..ae2a4ad126 100644 --- a/README.md +++ b/README.md @@ -301,7 +301,7 @@ Note the difference between serialization and assignment: json j_string = "this is a string"; // retrieve the string value -auto cpp_string = j_string.get(); +auto cpp_string = j_string.template get(); // retrieve the string value (alternative when a variable already exists) std::string cpp_string2; j_string.get_to(cpp_string2); @@ -310,7 +310,7 @@ j_string.get_to(cpp_string2); std::string serialized_string = j_string.dump(); // output of original string -std::cout << cpp_string << " == " << cpp_string2 << " == " << j_string.get() << '\n'; +std::cout << cpp_string << " == " << cpp_string2 << " == " << j_string.template get() << '\n'; // output of serialized value std::cout << j_string << " == " << serialized_string << std::endl; ``` @@ -483,7 +483,7 @@ for (auto& element : j) { } // getter/setter -const auto tmp = j[0].get(); +const auto tmp = j[0].template get(); j[1] = 42; bool foo = j.at(2); @@ -691,7 +691,7 @@ You can switch off implicit conversions by defining `JSON_USE_IMPLICIT_CONVERSIO // strings std::string s1 = "Hello, world!"; json js = s1; -auto s2 = js.get(); +auto s2 = js.template get(); // NOT RECOMMENDED std::string s3 = js; std::string s4; @@ -700,7 +700,7 @@ s4 = js; // Booleans bool b1 = true; json jb = b1; -auto b2 = jb.get(); +auto b2 = jb.template get(); // NOT RECOMMENDED bool b3 = jb; bool b4; @@ -709,7 +709,7 @@ b4 = jb; // numbers int i = 42; json jn = i; -auto f = jn.get(); +auto f = jn.template get(); // NOT RECOMMENDED double f2 = jb; double f3; @@ -752,9 +752,9 @@ j["age"] = p.age; // convert from JSON: copy each value from the JSON object ns::person p { - j["name"].get(), - j["address"].get(), - j["age"].get() + j["name"].template get(), + j["address"].template get(), + j["age"].template get() }; ``` @@ -771,7 +771,7 @@ std::cout << j << std::endl; // {"address":"744 Evergreen Terrace","age":60,"name":"Ned Flanders"} // conversion: json -> person -auto p2 = j.get(); +auto p2 = j.template get(); // that's it assert(p == p2); @@ -798,13 +798,13 @@ namespace ns { ``` That's all! When calling the `json` constructor with your type, your custom `to_json` method will be automatically called. -Likewise, when calling `get()` or `get_to(your_type&)`, the `from_json` method will be called. +Likewise, when calling `template get()` or `get_to(your_type&)`, the `from_json` method will be called. Some important things: * Those methods **MUST** be in your type's namespace (which can be the global namespace), or the library will not be able to locate them (in this example, they are in namespace `ns`, where `person` is defined). * Those methods **MUST** be available (e.g., proper headers must be included) everywhere you use these conversions. Look at [issue 1108](https://github.com/nlohmann/json/issues/1108) for errors that may occur otherwise. -* When using `get()`, `your_type` **MUST** be [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible). (There is a way to bypass this requirement described later.) +* When using `template get()`, `your_type` **MUST** be [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible). (There is a way to bypass this requirement described later.) * In function `from_json`, use function [`at()`](https://json.nlohmann.me/api/basic_json/at/) to access the object values rather than `operator[]`. In case a key does not exist, `at` throws an exception that you can handle, whereas `operator[]` exhibits undefined behavior. * You do not need to add serializers or deserializers for STL types like `std::vector`: the library already implements these. @@ -889,8 +889,8 @@ namespace nlohmann { if (j.is_null()) { opt = boost::none; } else { - opt = j.get(); // same as above, but with - // adl_serializer::from_json + opt = j.template get(); // same as above, but with + // adl_serializer::from_json } } }; @@ -917,7 +917,7 @@ namespace nlohmann { // note: the return type is no longer 'void', and the method only takes // one argument static move_only_type from_json(const json& j) { - return {j.get()}; + return {j.template get()}; } // Here's the catch! You must provide a to_json method! Otherwise, you @@ -1021,11 +1021,11 @@ assert(j == "stopped"); // json string to enum json j3 = "running"; -assert(j3.get() == TS_RUNNING); +assert(j3.template get() == TS_RUNNING); // undefined json value to enum (where the first map entry above is the default) json jPi = 3.14; -assert(jPi.get() == TS_INVALID ); +assert(jPi.template get() == TS_INVALID ); ``` Just as in [Arbitrary Type Conversions](#arbitrary-types-conversions) above, @@ -1033,7 +1033,7 @@ Just as in [Arbitrary Type Conversions](#arbitrary-types-conversions) above, - It MUST be available (e.g., proper headers must be included) everywhere you use the conversions. Other Important points: -- When using `get()`, undefined JSON values will default to the first pair specified in your map. Select this default pair carefully. +- When using `template get()`, undefined JSON values will default to the first pair specified in your map. Select this default pair carefully. - If an enum or JSON value is specified more than once in your map, the first matching occurrence from the top of the map will be returned when converting to or from JSON. ### Binary formats (BSON, CBOR, MessagePack, UBJSON, and BJData)