我定义了一个模板类:
template <class T>
class TempClass
{
...
};
如果我想在一些 MyClass.h 中创建这个类的对象来访问模板类的函数,我应该如何传递模板的参数?我尝试执行以下操作:
class MyClass{
public:
TempClass<T> temp;
}
当然,假设它不起作用,因为 MyClass 中没有定义 T,所以我有点迷失如何正确地做到这一点。
谢谢。
如果你也想MyClass
成为一个模板,你可以这样做:
template<typename T>
struct MyClass {
TempClass<T> temp;
};
(您也可以使用class
而不是struct
,但由于所有成员都是公共的,因此您实际上不需要默认私有。)
如果您不想MyClass
成为模板,则需要一些具体类型来替换 for T
。例如:
struct MyClass {
TempClass<string> temp;
};
Pedantic: 从技术上讲,它TempClass
不是一个模板类,而是一个类模板。类模板实际上并不是一个类,它是一个模板,可用于创建本身就是模板类的各个类。因此,TempClass
是类模板,TempClass<string>
而是模板类——通过实例化模板创建的类。
模板不是类。是。顾名思义,模板可以帮助编译器创建类。也就是说,如果您有一个模板类template<typename T> class Foo{};
:
template<typename T>
struct Foo
{
T attribute;
};
它只是编译器用来生成不同版本的模板Foo
,每个版本都用于指定的类型。当您实例化模板时,即告诉编译器您需要生成具有指定类型的类时,编译器会生成一个Foo
代码版本,将模板参数替换为指定类型:
int main()
{
Foo<int> foo_int_variable;
Foo<bool> foo_bool_variable;
}
编译器在看到这两个实例后,生成如下代码:
struct __Foo_int
{
int attribute;
};
struct __Foo_bool
{
bool attribute;
};
所以 main 的代码被翻译成这样:
int main()
{
__Foo_int foo_int_variable;
__Foo_bool foo_bool_variable;
}
所以答案是:你需要指定你需要什么类型,让编译器生成正确的模板实例化。
如果使用 的类Foo
,例如在您的示例中,不需要 Foo 的特定实例化,需要通用版本Foo
,您也可以将该类设为模板。
您可以像这样实例化您的模板,例如,为 int 实例化:
class MyClass
{
public:
TempClass<int> temp;
};
但是,如果您仍然希望 MYClass 是通用的,您也可以将其设为模板并像这样定义它:
template<typename T>
class MyClass
{
public:
TempClass<T> temp;
};
并让任何 MyClass 对象实例化来定义参数 T,例如:
MyClass<int> class;