我定义了一个模板类:
template <class T>
class TempClass
{
...
};
如果我想创建这个类的对象,让我们说一些MyClass.h来访问模板类的函数,我该如何传递模板的参数? 我试着做以下事情:
class MyClass{
public:
TempClass<T> temp;
}
当然,因为它不起作用,因为T没有在MyClass中定义,所以我有点失去了它是如何正确的。
感谢。
答案 0 :(得分:1)
如果您希望MyClass
也是模板,您可以这样做:
template<typename T>
struct MyClass {
TempClass<T> temp;
};
(您也可以使用class
代替struct
,但由于所有成员都是公开的,因此您并不需要默认私有。)
如果您不希望MyClass
成为模板,则需要一些具体类型来代替T
。例如:
struct MyClass {
TempClass<string> temp;
};
迂腐:技术上TempClass
不是模板类,它是类模板。类模板实际上不是一个类,它是一个模板,可用于创建本身是模板类的单个类。因此,TempClass
是类模板,而TempClass<string>
是模板类---通过实例化模板创建的类。
答案 1 :(得分:1)
您可以像这样实例化模板,例如,实例化为int:
class MyClass
{
public:
TempClass<int> temp;
};
但是如果你仍然希望MYClass是通用的,那么你也可以制作模板并将其定义为:
template<typename T>
class MyClass
{
public:
TempClass<T> temp;
};
并让任何MyClass对象实例化来定义参数T,例如:
MyClass<int> class;
答案 2 :(得分:1)
模板不是类。是。因为它的名称意味着,模板可以帮助编译器创建类。也就是说,如果您有模板类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
的通用版本,您也可以将该类设置为模板。