C++ 类模板实例化

C++ 类模板实例化,c++,templates,instantiation,C++,Templates,Instantiation,我刚刚读了关于的wiki文章,对模板实例化有点困惑 根据维基的说法 成员函数体(定义)直到很长时间才实例化 在他们的声明之后 我不太明白这是什么意思 假设我有一个类模板: template <typename T> class A { public: void foo(T t) { //... }; }; 模板 甲级 { 公众: void foo(T) { //... }; }; 当我实例化类模板A时

我刚刚读了关于的wiki文章,对模板实例化有点困惑

根据维基的说法

成员函数体(定义)直到很长时间才实例化 在他们的声明之后

我不太明白这是什么意思

假设我有一个类模板:

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)
然后在编译a.cpp时,只会实例化a。然而,在编译b.cpp的过程中,这两者都将被实例化

因此,如果A::foo包含给定模板参数集的一些语义无效的代码,则在b.cpp中会出现编译错误,而在A.cpp中则不会


我希望这能把事情弄清楚

对于类模板,经验法则是只实例化实际使用的那些成员

如果你想要完整实例化,C++提供了明确的实例化(但是,通常你不这样做,事实上,不是每一个位都被完全实例化)意味着你的模板类更通用,因为它降低了对<代码> t>代码的要求,注意语法检查和非依赖类型的查找。(不依赖于

T
的东西仍然会发生)


您可以在这里找到更完整的答案:

Plug:这可能会回答您的问题:Upvote用于提及显式实例化强制完成实例化