[ 
https://issues.apache.org/jira/browse/PROTON-1831?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Kim van der Riet updated PROTON-1831:
-------------------------------------
    Description: 
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}
 

  was:
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}
 


> [C++ binding] Nested complex types fail compilation with "incomplete type" 
> error
> --------------------------------------------------------------------------------
>
>                 Key: PROTON-1831
>                 URL: https://issues.apache.org/jira/browse/PROTON-1831
>             Project: Qpid Proton
>          Issue Type: Bug
>          Components: cpp-binding
>            Reporter: Kim van der Riet
>            Priority: Major
>
> 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
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@qpid.apache.org
For additional commands, e-mail: dev-h...@qpid.apache.org

Reply via email to