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
>
>
|