Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > boost::serialization, как убрать warning'и


Автор: volatile 31.1.2011, 23:21
Буст выдает воринг, причем очень большой, хотя все компилится и работает.
Вот попытался выделить минимум в отдельный проект, чтобы не загромождать:
Код

#include "stdafx.h"
#define _SCL_SECURE_NO_WARNINGS
#include <fstream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>

class test
{
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & val;
    }
    int val;
};

int _tmain(int argc, _TCHAR* argv[])
{
   test a;
   std::ofstream ofs("name.txt", std::ios::out);
   boost::archive::text_oarchive oa(ofs);
   oa << a;
   return 0;
}


Вот эта программка компилится, но выдаёт воринг на 50 строк.
Код

1>Compiling...
1>vingrad.cpp
1>C:\MSVS2008\MYADD\MY\INCLUDE\boost/mpl/print.hpp(51) : warning C4308: negative integral constant converted to unsigned type
1>        C:\MSVS2008\MYADD\MY\INCLUDE\boost/serialization/static_warning.hpp(92) : see reference to class template instantiation 'boost::mpl::print<T>' being compiled
1>        with
1>        [
1>            T=boost::serialization::STATIC_WARNING_LINE<98>
1>        ]
1>        C:\MSVS2008\MYADD\MY\INCLUDE\boost/archive/detail/check.hpp(98) : see reference to class template instantiation 'boost::serialization::static_warning_test<B,L>' being compiled
1>        with
1>        [
1>            B=false,
1>            L=98
1>        ]
--cuted--

Как вы догадались компилю на VS2008
Что посоветуете?

Автор: boostcoder 31.1.2011, 23:42
Цитата(volatile @  31.1.2011,  23:21 Найти цитируемый пост)
Буст выдает воринг

враки.

это:
Код

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

class test
{
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & val;
    }
    int val;
};

int main(int argc, char** argv)
{
   test a;
   std::ofstream ofs("name.txt", std::ios::out);
   boost::archive::text_oarchive oa(ofs);
   oa << a;
   return 0;
}


+ g++-4.5.2 = ни одного варнинга.

Добавлено через 4 минуты и 39 секунд
может это что-то специфичное для msvc2008 ?

Автор: volatile 31.1.2011, 23:54
boostcoder, охотно верю что 
Цитата(boostcoder @  31.1.2011,  23:42 Найти цитируемый пост)
+ g++-4.5.2 = ни одного варнинга.

Но от этого мне не легче.
Может кто работал на студии с бустом, посоветуют.
Задефайнить что-то нужно видимо, но что не знаю.

Автор: boostcoder 1.2.2011, 00:01
Цитата(volatile @  31.1.2011,  23:21 Найти цитируемый пост)
boost/archive/detail/check.hpp(98) : see reference to class template instantiation 'boost::serialization::static_warning_test<B,L>' being compiled

в 98ой строке это:
Код

template<class T>
inline void check_object_tracking(){
    // presume it has already been determined that
    // T is not a const
    BOOST_STATIC_ASSERT(! boost::is_const< T >::value);
    typedef BOOST_DEDUCED_TYPENAME mpl::equal_to<
        serialization::tracking_level< T >,
        mpl::int_<serialization::track_never>
    >::type typex;
    // saving an non-const object of a type not marked "track_never)

    // may be an indicator of an error usage of the
    // serialization library and should be double checked.  
    // See documentation on object tracking.  Also, see the 
    // "rationale" section of the documenation
    // for motivation for this checking.

    BOOST_STATIC_WARNING(typex::value); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
}

но в вашем примере все справедливо.
есть мысль, закомментировать строку "oa << a;" в примере. что говорит в этом случае?

Автор: volatile 1.2.2011, 00:12
Цитата(boostcoder @  1.2.2011,  00:01 Найти цитируемый пост)
есть мысль, закомментировать строку "oa << a;" в примере. что говорит в этом случае? 

Если закоментить эту строку, то ворингов нет. 
и?

Автор: volatile 1.2.2011, 01:38
Но это не решение же...

Автор: boostcoder 1.2.2011, 02:05
Цитата(volatile @  1.2.2011,  01:38 Найти цитируемый пост)
Но это не решение же...

 smile 
ну нет у меня ни вендус, ни микрософтстудии.
устанавливаю на виртуалку, все равно нужна временами.

Автор: semensemenov 1.2.2011, 09:56
может поможет деректива
#pragma warning(disable : номер варнинга)

Автор: bsa 1.2.2011, 18:33
Думаю еще зависит от версии буста. У меня такое появилось в версии 1.41. Компилятор gcc

Автор: bsa 1.2.2011, 18:59
Проблема решается добавлением в код:
Код
BOOST_CLASS_TRACKING(MyClass, boost::serialization::track_never);

Автор: volatile 1.2.2011, 23:28
bsa, да это работает!  smile 
В моем случае, вставил перед main
Код

BOOST_CLASS_TRACKING(test, boost::serialization::track_never);

int _tmain(int argc, _TCHAR* argv[])
{
   test a;
   std::ofstream ofs("name.txt", std::ios::out);
   ...
И ни одного воринга!

Пинок (в хорошем смысле этого слова smile ) в верном направлении дан, буду разбираться дальше.
bsa, спасибо.

Автор: bsa 1.2.2011, 23:54
volatile, в документации написано, в разделе tracking. Это предупреждение нужно, чтобы ты не допустил ошибки при двойной сериализации одного объекта в один архив.

Автор: volatile 2.2.2011, 00:07
ок, bsa! гланое знать что читать. А то в тоннах докуметации можно затеряться.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)