Skip to content

Using Boost.Test 1.65.0: no type named ‘value_type’ in ‘class Json::Value’ #671

Closed
@wolframroesler

Description

@wolframroesler

Hello,

I use Boost.Test, where until recently I could compare two Json::Value objects like this:

Json::Value actual = ...;
Json::Value expected = ...;
BOOST_TEST(actual==expected);

This stopped working when I upgraded to boost 1.65.0, where I now get the following compiler error:

In file included from /usr/local/include/boost/test/tools/collection_comparison_op.hpp:18:0,
                 from /usr/local/include/boost/test/test_tools.hpp:55,
                 from /usr/local/include/boost/test/unit_test.hpp:18,
                 from /home/wolfram/src/myfile.cpp:9:
/usr/local/include/boost/test/utils/is_forward_iterable.hpp: In instantiation of ‘struct boost::unit_test::bt_iterator_traits<Json::Value, true>’:
/usr/local/include/boost/test/tools/collection_comparison_op.hpp:437:5720:   required from ‘struct boost::test_tools::assertion::op::EQ<Json::Value, Json::Value, void>’
/usr/local/include/boost/test/tools/assertion.hpp:326:7:   required from ‘class boost::test_tools::assertion::binary_expr<boost::test_tools::assertion::value_expr<Json::Value&>, Json::Value&, boost::test_tools::assertion::op::EQ<Json::Value, Json::Value, void> >’
/home/wolfram/src/myfile.cpp:122:17:   required from here
/usr/local/include/boost/test/utils/is_forward_iterable.hpp:206:36: error: no type named ‘value_type’ in ‘class Json::Value’
     typedef typename T::value_type value_type;
                                    ^

One solution to make it compile is by adding the following line to Json::Value:

  typedef std::string value_type;

at the end of the initial list of typedefs, like so (using jsoncpp 1.8.3):

$ git diff 
diff --git a/include/json/json.h b/include/json/json.h
index ac2e884..de5a9df 100644
--- a/include/json/json.h
+++ b/include/json/json.h
@@ -634,6 +634,7 @@ public:
   typedef Json::LargestInt LargestInt;
   typedef Json::LargestUInt LargestUInt;
   typedef Json::ArrayIndex ArrayIndex;
+  typedef std::string value_type;
 
   static const Value& null;  ///< We regret this reference to a global instance; prefer the simpler Value().
   static const Value& nullRef;  ///< just a kludge for binary-compatibility; same as null

Now it builds and my tests pass. The question is, is this a good solution? I don't know enough about either how jsoncpp works or how BOOST_TEST works to tell.

Any help is appreciated. If I get a thumbs up from an expert on these matters I'll supply a merge request for this change.

Thanks!

PS: Another way to make my test program work is

BOOST_TEST(actual.toStyledString()==expected.toStyledString());

but I find this a lot less elegant than directly comparing the Json::Value objects.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions