c++serializationboostboost-serialization

Warnings when using Boost Serialization with -Wall -Wextra


I'm trying to use Boost.serialize. It appears to work fine, but I'm getting warnings when I turn on -Wextra and -Wall warnings with g++ (Version 10.2.0).

It ran fine, and compiled fine when I switch off the warnings. However I'd like to be able to get rid of them properly. I've been trying for hours but cannot find a solution. I found some examples of similar warnings, but those were cases when default constructors were not defined.

I have created a minimal example below:

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>

struct minimal {
    minimal()=default;
    minimal(int in) 
        : x {in}
    {}  

    template <typename Archive>
        void serialize(Archive & ar, const unsigned vers){
            ar & x;
        }   

    int x;
};

int main()
{
    std::stringstream ss; 
    boost::archive::text_oarchive oa {ss};

    minimal M {10} ; 
    oa << M;  

    return 0;
}

The output when I compile is

g++ -Wextra -Wall minimal.cc  -lboost_serialization 

minimal.cc: In instantiation of 'void minimal::serialize(Archive&, unsigned int) [with Archive = boost::archive::text_oarchive]':
/usr/include/boost/serialization/access.hpp:116:20:   required from 'static void boost::serialization::access::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive; T = minimal]'
/usr/include/boost/serialization/serialization.hpp:59:22:   required from 'void boost::serialization::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive; T = minimal]'
/usr/include/boost/serialization/serialization.hpp:109:14:   required from 'void boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive; T = minimal]'
/usr/include/boost/archive/detail/oserializer.hpp:153:40:   required from 'void boost::archive::detail::oserializer<Archive, T>::save_object_data(boost::archive::detail::basic_oarchive&, const void*) const [with Archive = boost::archive::text_oarchive; T = minimal]'
/usr/include/boost/archive/detail/oserializer.hpp:106:1:   [ skipping 2 instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ]
/usr/include/boost/archive/detail/oserializer.hpp:315:22:   required from 'static void boost::archive::detail::save_non_pointer_type<Archive>::invoke(Archive&, const T&) [with T = minimal; Archive = boost::archive::text_oarchive]'
/usr/include/boost/archive/detail/oserializer.hpp:539:18:   required from 'void boost::archive::save(Archive&, T&) [with Archive = boost::archive::text_oarchive; T = const minimal]'
/usr/include/boost/archive/detail/common_oarchive.hpp:71:22:   required from 'void boost::archive::detail::common_oarchive<Archive>::save_override(T&) [with T = const minimal; Archive = boost::archive::text_oarchive]'
/usr/include/boost/archive/basic_text_oarchive.hpp:83:52:   required from 'void boost::archive::basic_text_oarchive<Archive>::save_override(T&) [with T = const minimal; Archive = boost::archive::text_oarchive]'
/usr/include/boost/archive/detail/interface_oarchive.hpp:70:36:   required from 'Archive& boost::archive::detail::interface_oarchive<Archive>::operator<<(const T&) [with T = minimal; Archive = boost::archive::text_oarchive]'
minimal.cc:24:11:   required from here
minimal.cc:11:46: warning: unused parameter 'vers' [-Wunused-parameter]
   11 |  void serialize(Archive & ar, const unsigned vers){
      |                               ~~~~~~~~~~~~~~~^~~~
'''

Solution

  • It's easy to fix, just remove the unused argument's name, or comment out its name.

    struct minimal {
        minimal()=default;
        minimal(int in) 
            : x {in}
        {}  
    
        template <typename Archive>
            void serialize(Archive & ar, unsigned /*vers*/){
                ar & x;
            }   
    
        int x;
    };
    

    With C++17 you have [[maybe_unused]] attribute specifier, like:

    struct minimal {
        minimal()=default;
        minimal(int in) 
            : x {in}
        {}  
    
        template <typename Archive>
            void serialize(Archive & ar,[[maybe_unused]] unsigned ver){
                ar & x;
            }   
    
        int x;
    };
    

    See this question for further reading:

    Unused parameter in c++11