如果我有一个模板类,在.cpp文件中定义了一些方法而不是.h文件,我可以使用显式实例化来让编译器避免未解析的外部。
但如果使用前向声明类型声明显式实例化,它会起作用吗?
template <typename T> struct Template
{
void someFunc(); //defined in the .cpp file
}
class A;
template Template<A>;
如果最终未定义A
且未使用Template<A>
会不会有效?
答案 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;
希望这会有所帮助。