
Robert Ramey wrote
The only reason to export a type is if one needs to serialize it through a base class pointer. So, to me the best way to suppress the warning would be to not export the type.
The warning message appears even if you don't export the type: Here is a simple test case //================================== #include <boost/archive/text_iarchive.hpp> #include <boost/archive/text_oarchive.hpp> #include <boost/serialization/base_object.hpp> #include <boost/serialization/string.hpp> #include <boost/serialization/vector.hpp> #include <boost/serialization/shared_ptr.hpp> // no need to include shared_ptr #include <boost/serialization/export.hpp> class Concrete { public: Concrete(const std::string& name ) : name_(name) {} Concrete() {} private: std::string name_; friend class boost::serialization::access; template<class Archive> void serialize(Archive& ar,const unsigned int){ ar & name_; } }; class Base { public: Base(const std::string& name ) : name_(name) {} Base() {} virtual ~Base(){} private: std::string name_; *std::vector<boost::shared_ptr<Concrete> > vec_*; friend class boost::serialization::access; template<class Archive> void serialize(Archive & ar, const unsigned int) { ar & name_; ar & vec_; } }; class Derived : public Base { public: Derived(const std::string& name ) : Base(name) {} Derived() {} private: friend class boost::serialization::access; template<class Archive> void serialize(Archive & ar, const unsigned int) { ar & boost::serialization::base_object<Base>(*this); } }; BOOST_CLASS_EXPORT(Derived); //================================== Notice that I have not exported Concrete, but the serialisation will spit out a warning message, about class Concrete. ... boost_1_39_0/boost/serialization/extended_type_info_typeid.hpp", line 88: warning #2414-D: delete of pointer to incomplete class BOOST_STATIC_WARNING(boost::is_polymorphic<T>::value); ^detected during: instantiation of "const boost::serialization::extended_type_info *boost::serialization::extended_type_info_typeid<T>::get_derived_extended_type_info(const T &) const [with T=Concrete]" at line 92 of "/scratch/ma/emos/ma0/hpia64/boost/boost_1_39_0/boost/archive/shared_ptr_helper.hpp" It looks like if we are serialising via a base ptr, and the base class is serialising concrete data member via a shared ptr, it has assumed that the type must be polymorphic. This does not seem right to me ? Best regards, Ta, Avi