[sigc] TypeTraits



The following doesn’t compile neither with VC 7.1 neither with Comeau (but it’s ok with GCC) :

 

class VirtualClass

{

public:

   virtual void f()=0;

  

   sigc::signal<void> event;

   void CallbackFunc()  {};

  

   void DoConnection()

   {

      event.connect(sigc::mem_fun(this, &VirtualClass::CallbackFunc));

   }

};

 

This is because of the implementation of type_traits :

truct type_trait

{

  typedef T_type  type;

  typedef T_type& pass;

  typedef const T_type& take;

  typedef T_type* pointer;

  static  T_type  instance(); /* not implemented */ 

};

 

When instanciating is_base_and_derived<trackable, VirtualClass>, the compiler refuses to generate instance() because VirtualClass is virtual. However, the instance() method is never used in the code. I do not know m4, but it seems that this method is only used with GCC to circumvent a GCC bug / use the typeof facility : see operator.h.m4, line 91. Therefore, I guess those type_trait::instance() methods should be removed, or at least generated only conditionnally.

 

Here is the complete compiler error message with VC 7.1 :

 

 

d:\users\adb\utils\libsigcplusplus\libsigc++-2.0.3\sigc++\type_traits.h(33) : error C2259: 'VirtualClass' : cannot instantiate abstract class

        due to following members:

        'void VirtualClass::f(void)' : pure virtual function was not defined

        d:\users\adb\dev\temp\test_libsigcplusplus_abstractclass\test_libsigcplusplus_abstractclass\test_libsigcplusplus_abstractclass.cpp(12) : see declaration of 'VirtualClass::f'

        d:\users\adb\utils\libsigcplusplus\libsigc++-2.0.3\sigc++\type_traits.h(116) : see reference to class template instantiation 'sigc::type_trait<T_type>' being compiled

        with

        [

            T_type=VirtualClass

        ]

        d:\users\adb\utils\libsigcplusplus\libsigc++-2.0.3\sigc++\visit_each.h(72) : see reference to class template instantiation 'sigc::is_base_and_derived<T_base,T_derived>' being compiled

        with

        [

            T_base=sigc::trackable,

            T_derived=VirtualClass

        ]

        d:\users\adb\utils\libsigcplusplus\libsigc++-2.0.3\sigc++\visit_each.h(113) : see reference to function template instantiation 'void sigc::internal::limit_derived_target<T_target,T_action>::operator ()<T_functor>(const T_type &) const' being compiled

        with

        [

            T_target=sigc::trackable *,

            T_action=sigc::internal::slot_do_bind,

            T_functor=VirtualClass,

            T_type=VirtualClass

        ]

        d:\users\adb\utils\libsigcplusplus\libsigc++-2.0.3\sigc++\functors\mem_fun.h(1798) : see reference to function template instantiation 'void sigc::visit_each<T_action,T_obj>(const T_action &,const T_functor &)' being compiled

        with

        [

            T_action=sigc::internal::limit_derived_target<sigc::trackable *,sigc::internal::slot_do_bind>,

            T_obj=VirtualClass,

            T_functor=VirtualClass

        ]

        d:\users\adb\utils\libsigcplusplus\libsigc++-2.0.3\sigc++\adaptors\adaptor_trait.h(267) : see reference to function template instantiation 'void sigc::visit_each<T_action,void,VirtualClass>(const T_action &,const sigc::bound_mem_functor0<T_return,T_obj> &)' being compiled

        with

        [

            T_action=sig

c::internal::limit_derived_target<sigc::trackable *,sigc::internal::slot_do_bind>,

            T_return=void,

            T_obj=VirtualClass

        ]

        d:\users\adb\utils\libsigcplusplus\libsigc++-2.0.3\sigc++\visit_each.h(124) : see reference to function template instantiation 'void sigc::visit_each<sigc::internal::limit_derived_target<T_target,T_action>,sigc::adaptor_trait<T_functor>::functor_type>(const sigc::internal::limit_derived_target<T_target,T_action> &,const sigc::adaptor_functor<T_functor> &)' being compiled

        with

        [

            T_target=sigc::trackable *,

            T_action=sigc::internal::slot_do_bind,

            T_functor=sigc::bound_mem_functor0<void,VirtualClass>

        ]

        d:\users\adb\utils\libsigcplusplus\libsigc++-2.0.3\sigc++\functors\slot.h(39) : see reference to function template instantiation 'void sigc::visit_each_type<sigc::trackable*,sigc::internal::slot_do_bind,sigc::internal::typed_slot_rep<T_functor>::adaptor_type>(const T_action &,const sigc::adaptor_functor<T_functor> &)' being compiled

        with

        [

            T_functor=sigc::bound_mem_functor0<void,VirtualClass>,

            T_action=sigc::internal::slot_do_bind

        ]

        d:\users\adb\utils\libsigcplusplus\libsigc++-2.0.3\sigc++\functors\slot.h(37) : while compiling class-template member function 'sigc::internal::typed_slot_rep<T_functor>::typed_slot_rep(const T_functor &)'

        with

        [

            T_functor=sigc::bound_mem_functor0<void,VirtualClass>

        ]

        d:\users\adb\utils\libsigcplusplus\libsigc++-2.0.3\sigc++\functors\slot.h(436) : see reference to class template instantiation 'sigc::internal::typed_slot_rep<T_functor>' being compiled

        with

        [

            T_functor=sigc::bound_mem_functor0<void,VirtualClass>

        ]

        d:\users\adb\utils\libsigcplusplus\libsigc++-2.0.3\sigc++\functors\slot.h(1089) : see reference to function template instantiation 'sigc::slot0<T_return>::slot0<T_functor>(const T_functor &)' being compiled

        with

        [

            T_return=void,

            T_functor=sigc::bound_mem_functor0<void,VirtualClass>

        ]

        d:\users\adb\dev\temp\test_libsigcplusplus_abstractclass\test_libsigcplusplus_abstractclass\test_libsigcplusplus_abstractclass.cpp(19) : see reference to function template instantiation 'sigc::slot<T_return>::slot<sigc::bound_mem_functor0<T_return,T_obj>>(const T_functor &)' being compiled

        with

        [

            T_return=void,

            T_obj=VirtualClass,

            T_functor=sigc::bound_mem_functor0<void,VirtualClass>

        ]

 

 

Arnaud



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]