Skip to content

Compilation Error: Cannot assign to non-static data member 'length' in document.h #2367

@bnjmnjrk

Description

@bnjmnjrk

Description

When compiling tutorial.cpp, the build fails due to a const assignment error in rapidjson/document.h

Reproduce

wget https://github.com/Tencent/rapidjson/archive/refs/tags/v1.1.0.tar.gz
tar -xf v1.1.0.tar.gz
mv rapidjson-1.1.0/include/rapidjson .
mv rapidjson-1.1.0/example/tutorial/tutorial.cpp .
zig c++ tutorial.cpp --std=c++17

Error

Click to expand!
In file included from tutorial.cpp:4:
./rapidjson/document.h:319:82: error: cannot assign to non-static data member 'length' with const-qualified type 'const SizeType' (aka 'const unsigned int')
  319 |     GenericStringRef& operator=(const GenericStringRef& rhs) { s = rhs.s; length = rhs.length; }
      |                                                                           ~~~~~~ ^
./rapidjson/document.h:325:20: note: non-static data member 'length' declared const here
  325 |     const SizeType length; //!< length of the string (excluding the trailing NULL terminator)
      |     ~~~~~~~~~~~~~~~^~~~~~
./rapidjson/document.h:102:19: warning: 'iterator<std::random_access_iterator_tag, rapidjson::GenericMember<rapidjson::UTF8<>, rapidjson::MemoryPoolAllocator<>>>' is deprecated [-Wdeprecated-declarations]
  102 |     : public std::iterator<std::random_access_iterator_tag
      |                   ^
./rapidjson/document.h:548:22: note: in instantiation of template class 'rapidjson::GenericMemberIterator<false, rapidjson::UTF8<>, rapidjson::MemoryPoolAllocator<>>' requested here
  548 |     typedef typename GenericMemberIterator<false,Encoding,Allocator>::Iterator MemberIterator;  //!< Member iterator for iterating in object.
      |                      ^
./rapidjson/document.h:2024:32: note: in instantiation of template class 'rapidjson::GenericValue<rapidjson::UTF8<>>' requested here
 2024 | class GenericDocument : public GenericValue<Encoding, Allocator> {
      |                                ^
tutorial.cpp:18:14: note: in instantiation of template class 'rapidjson::GenericDocument<rapidjson::UTF8<>>' requested here
   18 |     Document document;  // Default template parameter uses UTF8 and MemoryPoolAllocator.
      |              ^
zig-x86_64-linux-0.15.2/lib/libcxx/include/__iterator/iterator.h:23:29: note: 'iterator<std::random_access_iterator_tag, rapidjson::GenericMember<rapidjson::UTF8<>, rapidjson::MemoryPoolAllocator<>>>' has been explicitly marked deprecated here
   23 | struct _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 iterator {
      |                             ^
zig-x86_64-linux-0.15.2/lib/libcxx/include/__config:725:41: note: expanded from macro '_LIBCPP_DEPRECATED_IN_CXX17'
  725 | #    define _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_DEPRECATED
      |                                         ^
zig-x86_64-linux-0.15.2/lib/libcxx/include/__config:698:49: note: expanded from macro '_LIBCPP_DEPRECATED'
  698 | #      define _LIBCPP_DEPRECATED __attribute__((__deprecated__))
      |                                                 ^
In file included from tutorial.cpp:4:
./rapidjson/document.h:110:18: warning: 'iterator<std::random_access_iterator_tag, rapidjson::GenericMember<rapidjson::UTF8<>, rapidjson::MemoryPoolAllocator<>>>' is deprecated [-Wdeprecated-declarations]
  110 |     typedef std::iterator<std::random_access_iterator_tag,ValueType> BaseType;
      |                  ^
zig-x86_64-linux-0.15.2/lib/libcxx/include/__iterator/iterator.h:23:29: note: 'iterator<std::random_access_iterator_tag, rapidjson::GenericMember<rapidjson::UTF8<>, rapidjson::MemoryPoolAllocator<>>>' has been explicitly marked deprecated here
   23 | struct _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 iterator {
      |                             ^
zig-x86_64-linux-0.15.2/lib/libcxx/include/__config:725:41: note: expanded from macro '_LIBCPP_DEPRECATED_IN_CXX17'
  725 | #    define _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_DEPRECATED
      |                                         ^
zig-x86_64-linux-0.15.2/lib/libcxx/include/__config:698:49: note: expanded from macro '_LIBCPP_DEPRECATED'
  698 | #      define _LIBCPP_DEPRECATED __attribute__((__deprecated__))
      |                                                 ^
In file included from tutorial.cpp:4:
./rapidjson/document.h:102:19: warning: 'iterator<std::random_access_iterator_tag, const rapidjson::GenericMember<rapidjson::UTF8<>, rapidjson::MemoryPoolAllocator<>>>' is deprecated [-Wdeprecated-declarations]
  102 |     : public std::iterator<std::random_access_iterator_tag
      |                   ^
./rapidjson/document.h:549:22: note: in instantiation of template class 'rapidjson::GenericMemberIterator<true, rapidjson::UTF8<>, rapidjson::MemoryPoolAllocator<>>' requested here
  549 |     typedef typename GenericMemberIterator<true,Encoding,Allocator>::Iterator ConstMemberIterator;  //!< Constant member iterator for iterating in object.
      |                      ^
./rapidjson/document.h:2024:32: note: in instantiation of template class 'rapidjson::GenericValue<rapidjson::UTF8<>>' requested here
 2024 | class GenericDocument : public GenericValue<Encoding, Allocator> {
      |                                ^
tutorial.cpp:18:14: note: in instantiation of template class 'rapidjson::GenericDocument<rapidjson::UTF8<>>' requested here
   18 |     Document document;  // Default template parameter uses UTF8 and MemoryPoolAllocator.
      |              ^
zig-x86_64-linux-0.15.2/lib/libcxx/include/__iterator/iterator.h:23:29: note: 'iterator<std::random_access_iterator_tag, const rapidjson::GenericMember<rapidjson::UTF8<>, rapidjson::MemoryPoolAllocator<>>>' has been explicitly marked deprecated here
   23 | struct _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 iterator {
      |                             ^
zig-x86_64-linux-0.15.2/lib/libcxx/include/__config:725:41: note: expanded from macro '_LIBCPP_DEPRECATED_IN_CXX17'
  725 | #    define _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_DEPRECATED
      |                                         ^
zig-x86_64-linux-0.15.2/lib/libcxx/include/__config:698:49: note: expanded from macro '_LIBCPP_DEPRECATED'
  698 | #      define _LIBCPP_DEPRECATED __attribute__((__deprecated__))
      |                                                 ^
In file included from tutorial.cpp:4:
./rapidjson/document.h:110:18: warning: 'iterator<std::random_access_iterator_tag, const rapidjson::GenericMember<rapidjson::UTF8<>, rapidjson::MemoryPoolAllocator<>>>' is deprecated [-Wdeprecated-declarations]
  110 |     typedef std::iterator<std::random_access_iterator_tag,ValueType> BaseType;
      |                  ^
zig-x86_64-linux-0.15.2/lib/libcxx/include/__iterator/iterator.h:23:29: note: 'iterator<std::random_access_iterator_tag, const rapidjson::GenericMember<rapidjson::UTF8<>, rapidjson::MemoryPoolAllocator<>>>' has been explicitly marked deprecated here
   23 | struct _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 iterator {
      |                             ^
zig-x86_64-linux-0.15.2/lib/libcxx/include/__config:725:41: note: expanded from macro '_LIBCPP_DEPRECATED_IN_CXX17'
  725 | #    define _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_DEPRECATED
      |                                         ^
zig-x86_64-linux-0.15.2/lib/libcxx/include/__config:698:49: note: expanded from macro '_LIBCPP_DEPRECATED'
  698 | #      define _LIBCPP_DEPRECATED __attribute__((__deprecated__))
      |                                                 ^
In file included from tutorial.cpp:4:
./rapidjson/document.h:1952:25: warning: first argument in call to 'memcpy' is a pointer to non-trivially copyable type 'Member' (aka 'GenericMember<rapidjson::UTF8<char>, rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>>') [-Wnontrivial-memcall]
 1952 |             std::memcpy(m, members, count * sizeof(Member));
      |                         ^
./rapidjson/document.h:2363:43: note: in instantiation of member function 'rapidjson::GenericValue<rapidjson::UTF8<>>::SetObjectRaw' requested here
 2363 |         stack_.template Top<ValueType>()->SetObjectRaw(members, memberCount, GetAllocator());
      |                                           ^
./rapidjson/reader.h:1736:31: note: in instantiation of member function 'rapidjson::GenericDocument<rapidjson::UTF8<>>::EndObject' requested here
 1736 |             bool hr = handler.EndObject(c);
      |                               ^
./rapidjson/reader.h:1832:39: note: in instantiation of function template specialization 'rapidjson::GenericReader<rapidjson::UTF8<>, rapidjson::UTF8<>>::Transit<1U, rapidjson::GenericInsituStringStream<rapidjson::UTF8<>>, rapidjson::GenericDocument<rapidjson::UTF8<>>>' requested here
 1832 |             IterativeParsingState d = Transit<parseFlags>(state, t, n, is, handler);
      |                                       ^
./rapidjson/reader.h:487:20: note: in instantiation of function template specialization 'rapidjson::GenericReader<rapidjson::UTF8<>, rapidjson::UTF8<>>::IterativeParse<1U, rapidjson::GenericInsituStringStream<rapidjson::UTF8<>>, rapidjson::GenericDocument<rapidjson::UTF8<>>>' requested here
  487 |             return IterativeParse<parseFlags>(is, handler);
      |                    ^
./rapidjson/document.h:2159:40: note: in instantiation of function template specialization 'rapidjson::GenericReader<rapidjson::UTF8<>, rapidjson::UTF8<>>::Parse<1U, rapidjson::GenericInsituStringStream<rapidjson::UTF8<>>, rapidjson::GenericDocument<rapidjson::UTF8<>>>' requested here
 2159 |         parseResult_ = reader.template Parse<parseFlags>(is, *this);
      |                                        ^
./rapidjson/document.h:2175:16: note: in instantiation of function template specialization 'rapidjson::GenericDocument<rapidjson::UTF8<>>::ParseStream<1U, rapidjson::UTF8<>, rapidjson::GenericInsituStringStream<rapidjson::UTF8<>>>' requested here
 2175 |         return ParseStream<parseFlags, Encoding, InputStream>(is);
      |                ^
./rapidjson/document.h:2200:16: note: in instantiation of function template specialization 'rapidjson::GenericDocument<rapidjson::UTF8<>>::ParseStream<1U, rapidjson::GenericInsituStringStream<rapidjson::UTF8<>>>' requested here
 2200 |         return ParseStream<parseFlags | kParseInsituFlag>(s);
      |                ^
./rapidjson/document.h:2208:16: note: in instantiation of function template specialization 'rapidjson::GenericDocument<rapidjson::UTF8<>>::ParseInsitu<0U>' requested here
 2208 |         return ParseInsitu<kParseDefaultFlags>(str);
      |                ^
tutorial.cpp:28:18: note: in instantiation of member function 'rapidjson::GenericDocument<rapidjson::UTF8<>>::ParseInsitu' requested here
   28 |     if (document.ParseInsitu(buffer).HasParseError())
      |                  ^
./rapidjson/document.h:1952:25: note: explicitly cast the pointer to silence this warning
 1952 |             std::memcpy(m, members, count * sizeof(Member));
      |                         ^
      |                         (void*)
./rapidjson/document.h:1939:25: warning: first argument in call to 'memcpy' is a pointer to non-trivially copyable type 'GenericValue<UTF8<>>' [-Wnontrivial-memcall]
 1939 |             std::memcpy(e, values, count * sizeof(GenericValue));
      |                         ^
./rapidjson/document.h:2371:43: note: in instantiation of member function 'rapidjson::GenericValue<rapidjson::UTF8<>>::SetArrayRaw' requested here
 2371 |         stack_.template Top<ValueType>()->SetArrayRaw(elements, elementCount, GetAllocator());
      |                                           ^
./rapidjson/reader.h:1766:31: note: in instantiation of member function 'rapidjson::GenericDocument<rapidjson::UTF8<>>::EndArray' requested here
 1766 |             bool hr = handler.EndArray(c);
      |                               ^
./rapidjson/reader.h:1832:39: note: in instantiation of function template specialization 'rapidjson::GenericReader<rapidjson::UTF8<>, rapidjson::UTF8<>>::Transit<1U, rapidjson::GenericInsituStringStream<rapidjson::UTF8<>>, rapidjson::GenericDocument<rapidjson::UTF8<>>>' requested here
 1832 |             IterativeParsingState d = Transit<parseFlags>(state, t, n, is, handler);
      |                                       ^
./rapidjson/reader.h:487:20: note: in instantiation of function template specialization 'rapidjson::GenericReader<rapidjson::UTF8<>, rapidjson::UTF8<>>::IterativeParse<1U, rapidjson::GenericInsituStringStream<rapidjson::UTF8<>>, rapidjson::GenericDocument<rapidjson::UTF8<>>>' requested here
  487 |             return IterativeParse<parseFlags>(is, handler);
      |                    ^
./rapidjson/document.h:2159:40: note: in instantiation of function template specialization 'rapidjson::GenericReader<rapidjson::UTF8<>, rapidjson::UTF8<>>::Parse<1U, rapidjson::GenericInsituStringStream<rapidjson::UTF8<>>, rapidjson::GenericDocument<rapidjson::UTF8<>>>' requested here
 2159 |         parseResult_ = reader.template Parse<parseFlags>(is, *this);
      |                                        ^
./rapidjson/document.h:2175:16: note: in instantiation of function template specialization 'rapidjson::GenericDocument<rapidjson::UTF8<>>::ParseStream<1U, rapidjson::UTF8<>, rapidjson::GenericInsituStringStream<rapidjson::UTF8<>>>' requested here
 2175 |         return ParseStream<parseFlags, Encoding, InputStream>(is);
      |                ^
./rapidjson/document.h:2200:16: note: in instantiation of function template specialization 'rapidjson::GenericDocument<rapidjson::UTF8<>>::ParseStream<1U, rapidjson::GenericInsituStringStream<rapidjson::UTF8<>>>' requested here
 2200 |         return ParseStream<parseFlags | kParseInsituFlag>(s);
      |                ^
./rapidjson/document.h:2208:16: note: in instantiation of function template specialization 'rapidjson::GenericDocument<rapidjson::UTF8<>>::ParseInsitu<0U>' requested here
 2208 |         return ParseInsitu<kParseDefaultFlags>(str);
      |                ^
tutorial.cpp:28:18: note: in instantiation of member function 'rapidjson::GenericDocument<rapidjson::UTF8<>>::ParseInsitu' requested here
   28 |     if (document.ParseInsitu(buffer).HasParseError())
      |                  ^
./rapidjson/document.h:1939:25: note: explicitly cast the pointer to silence this warning
 1939 |             std::memcpy(e, values, count * sizeof(GenericValue));
      |                         ^
      |                         (void*)
6 warnings and 1 error generated.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions