模板显式实例化是否适用于前向声明类型?
Does template explicit instantiation work with forward-declared-types?
如果我有一个模板 class 在 .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;
希望这对您有所帮助。
如果我有一个模板 class 在 .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;
希望这对您有所帮助。