C++模板类显式实例化公有方法时,是否自动实例化关联私有方法?
显式实例化模板类公有方法时,私有方法会被自动实例化吗?
之前我按照ISOCPP文档的建议,将模板类的声明与实现分离到头文件和.cc文件中,通过在.cc文件末尾显式实例化所需模板,为链接器提供足够的符号信息。近期发现只需显式实例化类的构造函数即可创建实例,示例代码如下:
// .h file template<typename T> class A { public: A(T& t) : t_(t) {}; void PublicMethod(); private: void PrivateMethod(); T& t_; }; // .cc file template<typename T> void A<T>::PublicMethod() { PrivateMethod(); return;} template<typename T> void A<T>::PrivateMethod() { // Do some work. return; } // 仅实例化构造函数和公有接口 template A::A(int); template void A<int>::PublicMethod(); // main中可执行以下操作 int main() { int val = 2; A<int> a(val); a.PublicMethod(); }
注:原代码中PublicMethod内的PrivateMethod漏写调用括号、main中引用绑定临时变量存在编译问题,此处做了小修正。
我存在的疑问是:当显式实例化公有方法时,是否会自动实例化所有相关的私有方法?
会的。当你显式实例化模板类的某个公有成员函数(比如A<int>::PublicMethod)时,编译器会自动实例化这个函数直接或间接调用的所有依赖成员——包括它用到的私有成员函数A<int>::PrivateMethod。
这是因为编译器要生成PublicMethod的可执行机器码,必须解析它内部的调用逻辑,而PrivateMethod的实现是PublicMethod正常工作的必要条件,所以会被连带实例化。
反过来,如果某个私有方法从未被任何已实例化的成员函数(构造函数、公有方法等)调用过,编译器就不会为它生成实例化代码——毕竟没有生成的必要。
内容的提问来源于stack exchange,提问作者user1101010
相关产品推荐
相关产品推荐

