编译器忽略函数模板特化

时间:2014-01-21 13:47:46

标签: c++ templates visual-c++ boost template-specialization

我们的项目使用boost :: serialization来序列化很多东西。 但是某些类型没有正确注册,并且在序列化它们时会出现“未注册的类”错误 我已将问题缩小到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,它是一个Serializable,它包含一个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项目,有时它的工作有时它没有...编译选项是相同的...我真的有没有线索发生了什么:'(

1 个答案:

答案 0 :(得分:0)

我们找到了解决方案,

一个(可序列化的)类有几个SerializableList成员,并且没有包含所有“BOOST_CLASS_EXPORT_KEY”行的文件。

其他正在运作的项目没有使用那个特定的班级......