Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当类模板被要求是完全的对象类型时,为什么要实例化它?_C++_Templates - Fatal编程技术网

C++ 当类模板被要求是完全的对象类型时,为什么要实例化它?

C++ 当类模板被要求是完全的对象类型时,为什么要实例化它?,c++,templates,C++,Templates,如果N3797::14.7.1/1[temp.inst],则类模板可以显式或隐式表示,并且类模板正在隐式实例化 除非已明确指定类模板专用化 实例化14.7.2或显式专门化14.7.3,类 当 专门化是在需要 完全定义的对象类型或类的完整性 类型影响程序的语义 让我举一个例子,当上下文不要求类类型是完全定义的时: #include <iostream> template<class T> struct A { void foo(); }; template<

如果N3797::14.7.1/1[temp.inst],则类模板可以显式或隐式表示,并且类模板正在隐式实例化

除非已明确指定类模板专用化 实例化14.7.2或显式专门化14.7.3,类 当 专门化是在需要 完全定义的对象类型或类的完整性 类型影响程序的语义

让我举一个例子,当上下文不要求类类型是完全定义的时:

#include <iostream>

template<class T>
struct A
{
    void foo();
};

template<class T> void A<T>::foo(){ std::cout << "foo" << std::endl; }

A<int>* a;
int main(){ a -> foo(); }

在该示例中,类模板既没有显式实例化,也没有隐式实例化。所以,我们实际上没有A级的定义,但尽管它工作得很好。你不能解释一下这种行为吗。

看一个例子,在这个例子中,a->foo;是需要完全定义的对象类型的上下文。

[expr.ref]/p2,emphasis mine:

对于第二个选项箭头,第一个表达式应具有指针 完成类类型


为什么您认为它是一个不需要完全定义的对象类型的上下文?

您正在调用一个::foo,所以您需要一个完整的类型。引用不是说在这种情况下模板是隐式实例化的吗?我怀疑调用该函数需要一个正确类型的this指针和一个完全类型的可寻址函数指针。我试图实现的是构造一个示例,如果模板没有显式实例化,它将导致编译器/链接器错误。它是possible@DmitryFucintv不是在一个有效的程序中,除非它是一个编译器错误,而且它可能还需要多个翻译单元;[temp]/p6可能有用。据我所知,我们不需要显式实例化模板,因为如果我们开始在需要完全定义对象类型的上下文中使用它,模板将被隐式实例化,因此我们可以将其用作一个完整定义的类或函数。@DmitryFucintv通常通过显式实例化声明将实现与接口分离,或节省编译时间。这一点尚不清楚编译器不知道显式实例化的事实在另一个翻译单位完成的安装。如果我们将显式实例化放在另一个TU中,并且该模板出现在需要安装该模板的上下文中,它会隐式安装吗?