模板显式实例化是否与前向声明类型一起使用?

时间:2017-09-26 15:38:01

标签: c++ templates forward-declaration explicit-instantiation

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

但如果使用前向声明类型声明显式实例化,它会起作用吗?

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

class A;

template Template<A>;

如果最终未定义A且未使用Template<A>会不会有效?

1 个答案:

答案 0 :(得分:1)

首先。如果模板被实例化,编译器只生成代码(在您的示例中,没有生成代码,因为没有实例化)。其次,传递一个类型模板参数。这里允许编译器安全地创建实例。 在您的示例中,您不会在某处使用该类型,但如果您愿意为了定义一个函数,我的第一个句子将再次应用,并且该函数只是在某个地方实例化时生成的。 就在这时,编译器必须拥有生成代码的所有知识。

// 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;

希望这会有所帮助。