簡體   English   中英

功能模板特化被編譯器忽略

[英]function template specialization ignored by the compiler

我們的項目使用boost :: serialization來序列化許多東西。 但是某些類型沒有正確注冊,並且在序列化它們時我們遇到“未注冊類”錯誤,我已將問題縮小為BOOST_CLASS_EXPORT_KEY,對於某些類型,BOOST_CLASS_EXPORT_KEY無法生成代碼。 BOOST_CLASS_EXPORT_KEY的作用是:

namespace boost {
    namespace serialization {
        template<>
        struct guid_defined< T > : boost::mpl::true_ {};
        template<>
        inline const char * guid< T >(){
            return K;
        }
    } /* serialization */
} /* boost */

所有被序列化的對象都從稱為Serializable的基類繼承。 序列化總是通過指向基類的指針完成的。

除一種情況外,此方法工作正常:有一個類模板SerializableList,它是一個可序列化的文件,其中包含T的列表

template< typename T>
class SerializableList
{
    ...
    std::vector<T> m_list;

    template<class Archive>
    void serialize( Archive & ar, const unsigned int /*version*/ )
    {
        ar & boost::serialization::base_object<businessObjects::Serializable>(*this);
        ar & mList;
    }
};

然后,在專用的cpp和hpp文件中,我們聲明此模板的每個實例以增強序列化,如下所示:

HPP:

BOOST_CLASS_EXPORT_KEY( SerializableList<SomeT*> );
BOOST_CLASS_EXPORT_KEY( SerializableList<SomeOtherT*> );
BOOST_CLASS_EXPORT_KEY( SerializableList<AThirdT*> );

CPP:

BOOST_CLASS_EXPORT_IMPLEMENT( SerializableList<SomeT*> );
BOOST_CLASS_EXPORT_IMPLEMENT( SerializableList<SomeOtherT*> );
BOOST_CLASS_EXPORT_IMPLEMENT( SerializableList<AThirdT*> );

但是這些行的一半不會在最終的可執行文件中生成可執行代碼! 如果我們在每行上都設置一個斷點並運行,那么一半的斷點就會消失,剩下的斷點屬於工作類型(可以序列化的那些)。 例如,斷點將保留在SerializableList<SomeT*>SerializableList<AThirdT*>而不是SerializableList<SomeOtherT*>

順便說一句,我們也試圖直接調用boost::serialization::guid<T>() ,雖然它可以正常工作,例如: boost::serialization::guid<SerializableList<SomeT*> >()返回鍵,它不是用於boost::serialization::guid<SerializableList<SomeOtherT*> >() ,它調用了默認實現...

那么,是否存在編譯器錯誤(我們使用Visual C ++ 2010 SP1),或者是編譯器忽略其中某些專業化的充分理由?

我忘了提及,所有這些代碼都位於一個庫中,該庫與exe項目鏈接在一起。 我嘗試了不同的exe項目,有時它有時起作用,有時卻沒有...編譯選項是相同的...我真的不知道發生了什么事情:'(

我們找到了解決方案,

一個(可序列化的)類具有幾個SerializableList成員,並且不包括帶有所有“ BOOST_CLASS_EXPORT_KEY ”行的文件。

其他正在運行的項目沒有使用該特定類...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM