从here可以看出,并非所有模板函数都在模板类中编译。标准说,如果方法或成员没有被使用,它就不会被编译。很酷的功能,确实!现在,让我们讨论以下层次结构:
class A
{
virtual void f() {};
};
template <typename T>
class B : public A
{
virtual void f () override
{
// do something dangerous
}
}
你永远不会知道是否正在调用B<int>::f
,对吧?原因是您可以使用动态绑定调用函数B::f
,并且您永远不知道A*
是否指向B
类型对象或从A
派生的其他类型对象。那么编译器应该如何处理这种情况呢?
A* ptr = nullptr;
if (i > 0)
{
ptr = new B<int>();
}
ptr->f();
编译器如何猜测/发现这种情况以生成B<int>::f
重要相关问题: Can a C++ class member function template be virtual?
答案 0 :(得分:1)
在程序的某个地方,您必须使用B<int>
或从中派生的类型来创建实例。此时,模板被实例化并生成其代码。还有明确的实例化。查看cppreference.com了解详情。