制作模板类的对象

时间:2013-08-21 16:01:16

标签: c++ qt templates object

我定义了一个模板类:

 template <class T>
    class TempClass
    {
    ...
    };

如果我想创建这个类的对象,让我们说一些MyClass.h来访问模板类的函数,我该如何传递模板的参数? 我试着做以下事情:

class MyClass{
public:
    TempClass<T> temp;
}

当然,因为它不起作用,因为T没有在MyClass中定义,所以我有点失去了它是如何正确的。

感谢。

3 个答案:

答案 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的通用版本,您也可以将该类设置为模板。