You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@qpid.apache.org by "Rakhi Kumari (Jira)" <ji...@apache.org> on 2022/04/27 14:15:00 UTC
[jira] [Commented] (PROTON-1840) [cpp] Nested complex types fail compilation with "incomplete type" error
[ https://issues.apache.org/jira/browse/PROTON-1840?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17528824#comment-17528824 ]
Rakhi Kumari commented on PROTON-1840:
--------------------------------------
The root of error is in line `proton::value pv = am;’
The library does not support the direct conversion from a nested complex type to proton value (std::vector<std::map<proton::value, proton::value> > to proton::value).
The workaround for this is that we can split the encoding process into two.
proton::value pv = am; _Split this into two steps._
std::vector<proton::value> v1 = \{m1, m2}; _// First encode std::map<proton::value, proton::value> into proton::value._
proton::value pv = v1; _// Finally std::vector<proton::value> into proton::value._
> [cpp] Nested complex types fail compilation with "incomplete type" error
> ------------------------------------------------------------------------
>
> Key: PROTON-1840
> URL: https://issues.apache.org/jira/browse/PROTON-1840
> Project: Qpid Proton
> Issue Type: Bug
> Components: cpp-binding
> Reporter: Kim van der Riet
> Priority: Major
> Labels: codec
>
> When using nested complex types (for example, a list of maps or an array of lists), the compiler fails to compile. For example, the following code snippet (saved as {{ctt.cpp}}):
> {noformat}
> #include <map>
> #include <vector>
> #include <proton/types.hpp>
> int main(int, char**) {
> std::map<proton::value, proton::value> m1 = {{uint8_t(0), "zero"}, {uint8_t(1), "one"}};
> std::map<proton::value, proton::value> m2 = {{true, "true"}, {false, "false"}};
> std::vector<std::map<proton::value, proton::value> > am = {m1, m2};
> proton::value pv = am;
> }{noformat}
> fails compilation with the following error:
> {noformat}
> In file included from install/include/proton/types.hpp:47:0,
> from ctt.cpp:3:
> install/include/proton/./codec/vector.hpp: In instantiation of ‘proton::codec::encoder& proton::codec::operator<<(proton::codec::encoder&, const std::vector<_Tp, _Alloc>&) [with T = std::map<proton::value, proton::value>; A = std::allocator<std::map<proton::value, proton::value> >]’:
> install/include/proton/./value.hpp:84:11: required from ‘typename proton::value::assignable<T, proton::value&>::type proton::value::operator=(const T&) [with T = std::vector<std::map<proton::value, proton::value> >; typename proton::value::assignable<T, proton::value&>::type = proton::value&]’
> install/include/proton/./value.hpp:79:85: required from ‘proton::value::value(const T&, typename proton::value::assignable<T>::type*) [with T = std::vector<std::map<proton::value, proton::value> >; typename proton::value::assignable<T>::type = void]’
> ctt.cpp:9:24: required from here
> install/include/proton/./codec/vector.hpp:39:31: error: incomplete type ‘proton::internal::type_id_of<std::map<proton::value, proton::value> >’ used in nested name specifier
> return e << encoder::array(x, internal::type_id_of<T>::value);
> ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> {noformat}
>
--
This message was sent by Atlassian Jira
(v8.20.7#820007)
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@qpid.apache.org
For additional commands, e-mail: dev-help@qpid.apache.org