模板是否具有向前宣传类型的显式实例化

Does template explicit instantiation work with forward-declared-types?

本文关键字:类型 实例化 是否      更新时间:2023-10-16

如果我有一个模板类,其中包含.cpp文件而不是.h文件中定义的某些方法,我可以使用显式实例化来获取编译器以避免使用未解决的外部。

,如果使用正面宣布的类型声明明确的实例化?

是否有效?
template <typename T> struct Template
{
  void someFunc(); //defined in the .cpp file
}
class A;
template Template<A>;

如果最终未定义A并且未使用Template<A>,它将起作用?

首先。该编译器仅在实例化模板时生成代码(在您的示例中,由于没有实例化,因此不会生成代码)。其次,您通过类型的模板参数。在这里,允许编译器安全创建一个实例。在您的示例中,您不使用某个地方的类型,但是如果您愿意要定义函数,我的第一个句子将再次适用,并且该功能只是在某个地方实例化时生成的。就在这一刻,编译器必须具有生成代码的所有知识。

// Example program
#include <iostream>

template <typename T> struct Template
{
  void someFunc(); //defined in the .cpp file
};
class A;
Template<A> foo;

但是,如果创建一个非类型参数的模板。它会失败,因为类型定义不完整,因为您担心。

// Example program
#include <iostream>
#include <string>
class A;
template <A parm> struct Template
{
  void someFunc() {
        parm.foo();   
  }
};
A a;
using foo = Template<a>;

对于此示例也是如此。在这里,您将创建一个对象a,当然,编译器需要更多地了解该类型。这就是为什么它失败的原因。

// Example program
#include <iostream>

template <typename T> struct Template
{
  T a;
};
class A;
Template<A> foo;

希望这会有所帮助。