0

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

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

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

class A;

template Template<A>;

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

4

1 回答 1

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;

希望这可以帮助。

于 2017-09-27T14:36:46.450 回答