Boost serialization中未特化base_object模板可正常运行的原因是什么?
这个编译行为的核心原因是C++标准规定的**注入类名(Injected Class Name)**规则。
具体原理如下:
- 对于类模板而言,在该类模板自身的作用域、以及其派生类的作用域内,直接书写类模板的名称(不带模板参数)时,编译器会自动将其解析为已经实例化、带对应参数的完整类型。
- 你的示例中
Derived继承的是Base<int>,因此在Derived类的作用域内部,名称查找时会优先匹配基类的注入类名,直接写Base就等价于写Base<int>,不需要手动补全模板参数。
结合你给出的宏定义展开后验证:
当你调用BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base)时,宏会展开为:
boost::serialization::make_nvp( "Base", boost::serialization::base_object<Base>(*this) )
这里出现在Derived成员函数内的Base已经被编译器解析为Base<int>,相当于实际代码为base_object<Base<int>>(*this),完全符合base_object模板的要求:第一个模板参数是合法的基类类型,第二个模板参数Derived可以通过传入的*this自动推导,两个静态断言也全部符合条件,因此可以正常编译。
如果脱离Derived类的作用域(比如在全局函数里操作Derived实例),直接写Base就会被识别为模板而非具体类型,此时就必须补全模板参数Base<int>才能正常使用。
内容的提问来源于stack exchange,提问作者gchen
相关产品推荐
相关产品推荐

