C++ 类模板实例化
我刚刚读了关于的wiki文章,对模板实例化有点困惑 根据维基的说法 成员函数体(定义)直到很长时间才实例化 在他们的声明之后 我不太明白这是什么意思 假设我有一个类模板:C++ 类模板实例化,c++,templates,instantiation,C++,Templates,Instantiation,我刚刚读了关于的wiki文章,对模板实例化有点困惑 根据维基的说法 成员函数体(定义)直到很长时间才实例化 在他们的声明之后 我不太明白这是什么意思 假设我有一个类模板: template <typename T> class A { public: void foo(T t) { //... }; }; 模板 甲级 { 公众: void foo(T) { //... }; }; 当我实例化类模板A时
template <typename T>
class A
{
public:
void foo(T t)
{
//...
};
};
模板
甲级
{
公众:
void foo(T)
{
//...
};
};
当我实例化类模板A时,它是否实例化了成员函数foo()
例如:
//in .cpp file
int main()
{
A<int> a; //question 1
//class template is instantiated here, isn't it?
//What about foo(), is it instantiated too?
a.foo(10); //question 2
//according to the quotation, foo() will not be instantiated until it is used.
//if so, foo() is instantiated right here, not in question 1, right?
}
//在.cpp文件中
int main()
{
A;//问题1
//类模板是在这里实例化的,不是吗?
//那么foo()呢,它也被实例化了吗?
a、 傅(10);//问题2
//根据引用,foo()在使用之前不会被实例化。
//如果是这样,foo()就在这里实例化,而不是在问题1中,对吗?
}
您似乎混淆了一件事:
实例化发生在编译过程中,而不是运行时。因此,您不能说“在哪一行”实例化了类模板或函数模板
也就是说,关于成员函数模板没有与类模板一起实例化这一事实,您是对的
在这种情况下,您可以观察它:您有以下文件
- h(定义类A和函数A::foo)
- a、 cpp(使用a)
- b、 cpp(使用A和A::foo)
我希望这能把事情弄清楚 对于类模板,经验法则是只实例化实际使用的那些成员
如果你想要完整实例化,C++提供了明确的实例化(但是,通常你不这样做,事实上,不是每一个位都被完全实例化)意味着你的模板类更通用,因为它降低了对<代码> t>代码的要求,注意语法检查和非依赖类型的查找。(不依赖于
T
的东西仍然会发生)
您可以在这里找到更完整的答案:Plug:这可能会回答您的问题:Upvote用于提及显式实例化强制完成实例化