2016-01-21 88 views
1

我試圖將一個成員變量添加到Boost存檔類。繼this,我想出了:boost :: archive :: text_oarchive的簡單擴展

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

#include <fstream> 

class MyOArchive : public boost::archive::text_oarchive_impl<MyOArchive> 
{ 
public: 
    bool MyData; 

    friend class boost::archive::detail::common_oarchive<MyOArchive>; 
    friend class basic_text_oarchive<MyOArchive>; 
    //friend class boost::serialization::save_access; // save_access in namespace boost::serialization does not name a type 

    MyOArchive(std::ostream& os, unsigned int flags = 0) : boost::archive::text_oarchive_impl<MyOArchive>(os, flags) {} 

}; 

class MyClass 
{ 
public: 

private: 
    friend class boost::serialization::access; 

    double Value; 

    template<class Archive> 
    void serialize(Archive & ar, const unsigned int version) 
    { 
     ar & Value; 
    } 

}; 


int main() 
{ 
    MyClass myClass; 

    std::ofstream outputStream("test.txt"); 
    //boost::archive::text_oarchive outputArchive(outputStream); 
    MyOArchive outputArchive(outputStream); 
    outputArchive << myClass; 
    outputStream.close(); 

    return 0; 
} 

不過,我得到了鏈接錯誤:

undefined reference to boost::archive::text_oarchive_impl<MyOArchive>::text_oarchive_impl(std::ostream&, unsigned int)

任何人能解釋這是怎麼回事錯在這裏?我不需要重新實現存檔的任何功能,只需附加此成員MyData即可。

+0

你可以讓樣品自包含嗎?我記得當我的boost庫使用不同版本的GCC編譯時,看到了這樣的細微問題。但我不記得具體情況。如果您發佈了一個包含自己的示例,可以嘗試重現鏈接器錯誤。 – sehe

+0

@sehe這個例子是自包含的,不是?請注意,如果切換到Boost中包含的標準存檔類,它鏈接正常。 –

+0

你是對的。一些我第一次瀏覽它時錯過了一部分。 – sehe

回答

1

啊。發現它。

您需要包含ipp才能完成一個鏈接到最終產品的TU中的基本實現。

#include <boost/archive/impl/basic_text_oarchive.ipp> 
#include <boost/archive/impl/text_oarchive_impl.ipp> 

此外,save_access生活在不同的 城堡 命名空間:

friend class boost::archive::save_access; 

Live On Coliru

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

#include <boost/archive/impl/basic_text_oarchive.ipp> 
#include <boost/archive/impl/text_oarchive_impl.ipp> 
#include <fstream> 

class MyOArchive : public boost::archive::text_oarchive_impl<MyOArchive> { 
    public: 
    bool MyData; 

    friend class boost::archive::detail::common_oarchive<MyOArchive>; 
    friend class basic_text_oarchive<MyOArchive>; 
    friend class boost::archive::save_access; 

    MyOArchive(std::ostream &os, unsigned int flags = 0) : boost::archive::text_oarchive_impl<MyOArchive>(os, flags) {} 
}; 

class MyClass { 
    private: 
    friend class boost::serialization::access; 

    double Value; 

    template <class Archive> void serialize(Archive &ar, unsigned) { ar &Value; } 
}; 

int main() { 
    MyClass myClass; 

    { 
     std::ofstream outputStream("test.txt"); 

     MyOArchive outputArchive(outputStream); 
     outputArchive << myClass; 
    } 
} 

輸出是

22 serialization::archive 13 0 0 6.95328877045326431e-310 
+0

是的,就是這樣!實際上,似乎MyOArchive中的三個朋友類聲明都不需要編譯+鏈接? –

+0

朋友聲明實際上是前向聲明。如果未聲明,它們將被視爲在封閉名稱空間中聲明。直到定義被編譯器看到後,類型纔會/不完整。 – sehe