Fixed ambiguous overload with JsonArraySubscript and JsonObjectSubscript (issue #122)

This commit is contained in:
Benoit Blanchon
2015-09-28 22:14:50 +02:00
parent d5e25b12b8
commit c6a4bfa886
25 changed files with 749 additions and 329 deletions

View File

@ -63,7 +63,8 @@ class JsonArray : public Internals::JsonPrintable<JsonArray>,
FORCE_INLINE bool add(const String &value);
FORCE_INLINE bool add(JsonArray &array);
FORCE_INLINE bool add(JsonObject &object);
FORCE_INLINE bool add(const JsonVariant &object);
template <typename T>
FORCE_INLINE bool add(const T &value);
// Sets the value at specified index.
FORCE_INLINE void set(size_t index, bool value);
@ -81,7 +82,8 @@ class JsonArray : public Internals::JsonPrintable<JsonArray>,
FORCE_INLINE void set(size_t index, const String &value);
FORCE_INLINE void set(size_t index, JsonArray &array);
FORCE_INLINE void set(size_t index, JsonObject &object);
FORCE_INLINE void set(size_t index, const JsonVariant &object);
template <typename T>
FORCE_INLINE void set(size_t index, const T &value);
// Gets the value at the specified index.
FORCE_INLINE JsonVariant get(size_t index) const;

View File

@ -77,8 +77,9 @@ inline bool JsonArray::add(JsonObject &object) {
return addNode<JsonObject &>(object);
}
inline bool JsonArray::add(const JsonVariant &object) {
return addNode<const JsonVariant &>(object);
template <typename T>
inline bool JsonArray::add(const T &variant) {
return addNode<const JsonVariant &>(variant);
}
template <typename TValue>
@ -149,8 +150,9 @@ inline void JsonArray::set(size_t index, JsonObject &object) {
return setNodeAt<JsonObject &>(index, object);
}
inline void JsonArray::set(size_t index, const JsonVariant &object) {
return setNodeAt<const JsonVariant &>(index, object);
template <typename T>
inline void JsonArray::set(size_t index, const T &variant) {
return setNodeAt<const JsonVariant &>(index, variant);
}
template <typename TValue>

View File

@ -8,6 +8,11 @@
#include "JsonSubscriptBase.hpp"
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4522)
#endif
namespace ArduinoJson {
class JsonArraySubscript : public JsonSubscriptBase<JsonArraySubscript> {
public:
@ -16,6 +21,15 @@ class JsonArraySubscript : public JsonSubscriptBase<JsonArraySubscript> {
using JsonSubscriptBase<JsonArraySubscript>::operator=;
JsonArraySubscript& operator=(const JsonArraySubscript& src) {
return assign<const JsonVariant&>(src);
}
template <typename T>
JsonArraySubscript& operator=(const T& src) {
return assign<const JsonVariant&>(src);
}
FORCE_INLINE bool success() const { return _index < _array.size(); }
FORCE_INLINE operator JsonVariant() const { return _array.get(_index); }
@ -52,3 +66,7 @@ inline std::ostream& operator<<(std::ostream& os,
#endif
} // namespace ArduinoJson
#ifdef _MSC_VER
#pragma warning(pop)
#endif

View File

@ -65,6 +65,9 @@ class JsonObject : public Internals::JsonPrintable<JsonObject>,
FORCE_INLINE bool set(const char* key, JsonArray& array);
FORCE_INLINE bool set(const char* key, JsonObject& object);
FORCE_INLINE bool set(const char* key, const JsonVariant& value);
template <typename T>
FORCE_INLINE bool set(const char* key, const T& value);
FORCE_INLINE bool set(const String& key, bool value);
FORCE_INLINE bool set(const String& key, float value, uint8_t decimals = 2);
FORCE_INLINE bool set(const String& key, double value, uint8_t decimals = 2);
@ -81,6 +84,8 @@ class JsonObject : public Internals::JsonPrintable<JsonObject>,
FORCE_INLINE bool set(const String& key, JsonArray& array);
FORCE_INLINE bool set(const String& key, JsonObject& object);
FORCE_INLINE bool set(const String& key, const JsonVariant& value);
template <typename T>
FORCE_INLINE bool set(const String& key, const T& value);
// Gets the value associated with the specified key.
FORCE_INLINE JsonVariant get(JsonObjectKey) const;

View File

@ -116,6 +116,10 @@ inline bool JsonObject::set(const char *key, JsonObject &object) {
inline bool JsonObject::set(const char *key, const JsonVariant &value) {
return setNodeAt<const char *, const JsonVariant &>(key, value);
}
template <typename T>
inline bool JsonObject::set(const char *key, const T &value) {
return setNodeAt<const char *, JsonVariant>(key, value);
}
inline bool JsonObject::set(const String &key, bool value) {
return setNodeAt<const String &, bool>(key, value);
}
@ -166,6 +170,10 @@ inline bool JsonObject::set(const String &key, JsonObject &object) {
inline bool JsonObject::set(const String &key, const JsonVariant &value) {
return setNodeAt<const String &, const JsonVariant &>(key, value);
}
template <typename T>
inline bool JsonObject::set(const String &key, const T &value) {
return setNodeAt<const String &, JsonVariant>(key, value);
}
template <typename TKey, typename TValue>
inline bool JsonObject::setNodeAt(TKey key, TValue value) {

View File

@ -8,6 +8,11 @@
#include "JsonSubscriptBase.hpp"
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4522)
#endif
namespace ArduinoJson {
template <typename TKey>
@ -19,6 +24,17 @@ class JsonObjectSubscript
using JsonSubscriptBase<JsonObjectSubscript<TKey> >::operator=;
JsonObjectSubscript<TKey>& operator=(const JsonObjectSubscript<TKey>& src) {
return JsonSubscriptBase<JsonObjectSubscript<TKey> >::template assign<
JsonVariant>(src);
}
template <typename T>
JsonObjectSubscript<TKey>& operator=(const T& src) {
return JsonSubscriptBase<JsonObjectSubscript<TKey> >::template assign<
JsonVariant>(src);
}
FORCE_INLINE bool success() const { return _object.containsKey(_key); }
FORCE_INLINE operator JsonVariant() const { return _object.get(_key); }
@ -60,4 +76,8 @@ inline std::ostream& operator<<(
return source.printTo(os);
}
#endif
}
} // namespace ArduinoJson
#ifdef _MSC_VER
#pragma warning(pop)
#endif

View File

@ -68,10 +68,10 @@ class JsonSubscriptBase : public JsonVariantBase<TImpl> {
}
FORCE_INLINE TImpl& operator=(JsonVariant value) {
return assign<JsonVariant>(value);
return assign<const JsonVariant&>(value);
}
private:
protected:
template <typename TValue>
FORCE_INLINE TImpl& assign(TValue value) {
TImpl* that = static_cast<TImpl*>(this);