模板是否具有向前宣传类型的显式实例化
Does template explicit instantiation work with forward-declared-types?
如果我有一个模板类,其中包含.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;
希望这会有所帮助。
相关文章:
- 检查某些类型是否是模板类 std::optional 的实例化
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 实例化模板时,我是否必须显式显示参数包中的类型?
- 为什么找不到使用命名空间中定义的类型实例化的 std::weak_ptr 的重载运算符==?
- 使用非量表类型实例化模板时修复编译错误
- 如何根据参数的类型实例化不同的类
- 如何使用引用类型实例化模板函数
- 防止为字符串流提取运算符不支持的类型实例化模板类 (>>)
- 编译器是否也将所有参数依赖类型实例化,即使超载函数的参数计数不匹配
- 使用合格类型实例化的模板内部功能的名称分辨率
- 强制static_assert在类型实例化期间激发
- 在运行时根据不同的类型实例化模板类
- 按类型实例化C++ lambda
- 标准容器模板可以用不完整类型实例化吗?
- visual c++泛型类型实例化
- 基于运行时类型实例化构造函数
- 如何用自己的类型实例化超类模板
- SFINAE用于类型实例化
- 阻止为给定类型实例化模板化的成员函数
- 泛型JNI类型实例化