Re: [Cppcms-users] Compile error: traits is not a template
Brought to you by:
artyom-beilis
From: 陈抒 <csf...@gm...> - 2012-09-01 13:24:45
|
I tried you codes the first time. It can't be compiled. $ make Scanning dependencies of target cppweb [ 3%] Building CXX object bin/CMakeFiles/cppweb.dir/groups.cpp.o In file included from /home/chenshu/work/kaimei/cppweb/src/groups.cpp:1:0: /home/chenshu/work/kaimei/cppweb/include/groups.h: In static member function ‘static void cppcms::json::traits<kaimei::groups>::set(cppcms::json::value&, const kaimei::groups&)’: /home/chenshu/work/kaimei/cppweb/include/groups.h:39:60: error: invalid initialization of non-const reference of type ‘cppcms::json::array& {aka std::vector<cppcms::json::value>&}’ from an rvalue of type ‘void’ make[2]: *** [bin/CMakeFiles/cppweb.dir/groups.cpp.o] Error 1 make[1]: *** [bin/CMakeFiles/cppweb.dir/all] Error 2 make: *** [all] Error 2 line 39 is : cppcms::json::array &a=v.at("values",cppcms::json::array()); I upgraded CppCMS to latest version, also read your API document. It seems your 'at' member function return 'void' 陈抒 Best regards http://blog.csdn.net/sheismylife On Sat, Sep 1, 2012 at 9:15 PM, Artyom Beilis <art...@ya...> wrote: > You hadn't read my code correctly > > cppcms::json::array &a=v.at("values",cppcms::json::array()); > > a is a reference and you fill it. > > Anyway read the cppcms::json::value reference documentation for further > details > > Artyom Beilis > -------------- > CppCMS - C++ Web Framework: http://cppcms.com/ > CppDB - C++ SQL Connectivity: http://cppcms.com/sql/cppdb/ > > ------------------------------ > *From:* 陈抒 <csf...@gm...> > *To:* Artyom Beilis <art...@ya...>; > cpp...@li... > *Sent:* Saturday, September 1, 2012 3:32 PM > > *Subject:* Re: [Cppcms-users] Compile error: traits is not a template > > I changed your codes a bit. > namespace cppcms { > namespace json { > > template<> > struct traits<kaimei::groups> { > > static void set(value &v, kaimei::groups const& in) { > v.set("size", in.size()); > cppcms::json::array a; > a.resize(in.values_.size()); > for(size_t i = 0; i < in.values_.size(); i++) { > a[i]=*in.values_[i]; > } > v.set("values", a); > } > }; > > } > } > > Two issues: > 1. This way is not efficient, a lot of deep copy would occur when copying > vector from array. > My original way is very simple, create a stringstream object, groups > object converts all member variables into string, append them to > stringstream. It does not looks elegant, but faster. > 2. It doesn't work. I got an exception: > cppcms::json::bad_cast: error converting from object > > > 陈抒 > Best regards > http://blog.csdn.net/sheismylife > > > On Sat, Sep 1, 2012 at 5:41 PM, Artyom Beilis <art...@ya...> wrote: > > Because shared_ptr<group> is not specialized for traits... > > You need manually create an array and sets its memebers.i.e > > Something like that: > > cppcms::json::array &a=v.at("values",cppcms::json::array()); > a.resize(in.values_.size()); > for(size_t i = 0;i<in.values_.size();i++) > a[i]=*in.values_[i]; > > > > > > Artyom Beilis > -------------- > CppCMS - C++ Web Framework: http://cppcms.com/ > CppDB - C++ SQL Connectivity: http://cppcms.com/sql/cppdb/ > > > > >________________________________ > > From: 陈抒 <csf...@gm...> > >To: Artyom Beilis <art...@ya...>; > cpp...@li... > >Sent: Saturday, September 1, 2012 10:05 AM > >Subject: Re: [Cppcms-users] Compile error: traits is not a template > > > > > >Thank you. But I see new error. > >groups.h file: > > > > > >#ifndef __GROUPS_H > >#define __GROUPS_H > > > > > >#include <vector> > >#include <boost/shared_ptr.hpp> > >#include "group.h" > > > > > >namespace kaimei{ > > > > > > class groups{ > > public: > > typedef std::vector<boost::shared_ptr<group> >::iterator iterator; > > typedef std::vector<boost::shared_ptr<group> >::const_iterator > const_iterator; > > > > > > void add(boost::shared_ptr<group> g); > > > > > > bool empty() const; > > > > > > unsigned int size() const; > > > > > > std::string json_string() const; > > > > friend class cppcms::json::traits<kaimei::groups>; > > > > > > private: > > std::vector<boost::shared_ptr<kaimei::group> > values_; > > }; > > > > > >} > > > > > >namespace cppcms { > > namespace json { > > > > > > template<> > > struct traits<kaimei::groups> { > > > > > > static void set(value &v, kaimei::groups const& in) { > >v.set("size", in.size()); > >v.set("values", in.values_); > > } > > }; > > > > > > } > >} > > > > > >#endif > > > > > > > > > >error message: > > 3%] Generating ../../src/view/welcome.cpp, ../../src/view/home.cpp, > ../../src/view/gprs_message.cpp, ../../src/view/gprs_manager.cpp, > ../../src/view/gprs_password.cpp, ../../src/view/gprs_log.cpp, > ../../src/view/register_client.cpp, ../../src/view/gprsConfig.cpp, > ../../src/view/login.cpp, ../../src/view/group_management.cpp > >[ 6%] Building CXX object bin/CMakeFiles/cppweb.dir/groups.cpp.o > >In file included from > /home/chenshu/work/kaimei/cppweb/include/group.h:5:0, > > from /home/chenshu/work/kaimei/cppweb/include/groups.h:6, > > from /home/chenshu/work/kaimei/cppweb/src/groups.cpp:1: > >/usr/include/cppcms/json.h: In member function ‘void > cppcms::json::value::set_value(const T&) [with T = > boost::shared_ptr<kaimei::group>]’: > >/usr/include/cppcms/json.h:604:5: instantiated from ‘static void > cppcms::json::traits<std::vector<T> >::set(cppcms::json::value&, const > std::vector<T>&) [with T = boost::shared_ptr<kaimei::group>]’ > >/usr/include/cppcms/json.h:247:4: instantiated from ‘void > cppcms::json::value::set_value(const T&) [with T = > std::vector<boost::shared_ptr<kaimei::group> >]’ > >/usr/include/cppcms/json.h:316:4: instantiated from > ‘cppcms::json::value::value(const T&) [with T = > std::vector<boost::shared_ptr<kaimei::group> >]’ > >/usr/include/cppcms/json.h:352:4: instantiated from ‘void > cppcms::json::value::set(const char*, const T&) [with T = > std::vector<boost::shared_ptr<kaimei::group> >]’ > >/home/chenshu/work/kaimei/cppweb/include/groups.h:39:28: instantiated > from here > >/usr/include/cppcms/json.h:247:4: error: incomplete type > ‘cppcms::json::traits<boost::shared_ptr<kaimei::group> >’ used in nested > name specifier > >make[2]: *** [bin/CMakeFiles/cppweb.dir/groups.cpp.o] Error 1 > >make[1]: *** [bin/CMakeFiles/cppweb.dir/all] Error 2 > >make: *** [all] Error 2 > > > > > >陈抒 > >Best regards > >http://blog.csdn.net/sheismylife > > > > > > > >On Sat, Sep 1, 2012 at 2:34 PM, Artyom Beilis <art...@ya...> > wrote: > > > >> > >> > >>>But I got error when compiling another class. It has group.h and > group.cpp file. > >>> > >>> > >>>#ifndef __GROUP_H > >>>#define __GROUP_H > >>> > >>> > >>>#include <string> > >>> > >>> > >>>namespace kaimei{ > >>>... > >> > >>} > >>> > >>> > >>>namespace cppcms { > >>> namespace json { > >>> template<> > >>> struct traits<kaimei::group> { > >>>... > >>> } > >>> } > >>>} > >>> > >>> > >>> > >>> [snip] > >> > >>> > >>>I am not good at template programming. Why did this happen? > >>> > >> > >>You can't specialize undefined struct - you need to include > <cppcms/json.h> > >>header. It provides the original traits struct and than you specialize > it for > >>your type of class > >> > >> > >> > >>> > >>>陈抒 > >>>Best regards > >>>http://blog.csdn.net/sheismylife > >>> > >> > >>Regards, > >>Artyom > >> > >> > > >>------------------------------------------------------------------------------ > >>Live Security Virtual Conference > >>Exclusive live event will cover all the ways today's security and > >>threat landscape has changed and how IT managers can respond. Discussions > >>will include endpoint security, mobile security and the latest in malware > >>threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ > >>_______________________________________________ > >>Cppcms-users mailing list > >>Cpp...@li... > >>https://lists.sourceforge.net/lists/listinfo/cppcms-users > >> > > > > >------------------------------------------------------------------------------ > >Live Security Virtual Conference > >Exclusive live event will cover all the ways today's security and > >threat landscape has changed and how IT managers can respond. Discussions > >will include endpoint security, mobile security and the latest in malware > >threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ > >_______________________________________________ > >Cppcms-users mailing list > >Cpp...@li... > >https://lists.sourceforge.net/lists/listinfo/cppcms-users > > > > > > > > > ------------------------------------------------------------------------------ > Live Security Virtual Conference > Exclusive live event will cover all the ways today's security and > threat landscape has changed and how IT managers can respond. Discussions > will include endpoint security, mobile security and the latest in malware > threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ > _______________________________________________ > Cppcms-users mailing list > Cpp...@li... > https://lists.sourceforge.net/lists/listinfo/cppcms-users > > > > > ------------------------------------------------------------------------------ > Live Security Virtual Conference > Exclusive live event will cover all the ways today's security and > threat landscape has changed and how IT managers can respond. Discussions > will include endpoint security, mobile security and the latest in malware > threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ > _______________________________________________ > Cppcms-users mailing list > Cpp...@li... > https://lists.sourceforge.net/lists/listinfo/cppcms-users > > > > > ------------------------------------------------------------------------------ > Live Security Virtual Conference > Exclusive live event will cover all the ways today's security and > threat landscape has changed and how IT managers can respond. Discussions > will include endpoint security, mobile security and the latest in malware > threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ > _______________________________________________ > Cppcms-users mailing list > Cpp...@li... > https://lists.sourceforge.net/lists/listinfo/cppcms-users > > |