3

我定义了一个模板类:

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

如果我想在一些 MyClass.h 中创建这个类的对象来访问模板类的函数,我应该如何传递模板的参数?我尝试执行以下操作:

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

当然,假设它不起作用,因为 MyClass 中没有定义 T,所以我有点迷失如何正确地做到这一点。

谢谢。

4

3 回答 3

2

如果你也想MyClass成为一个模板,你可以这样做:

template<typename T>
struct MyClass {
    TempClass<T> temp;
};

(您也可以使用class而不是struct,但由于所有成员都是公共的,因此您实际上不需要默认私有。)

如果您不想MyClass成为模板,则需要一些具体类型来替换 for T。例如:

struct MyClass {
    TempClass<string> temp;
};

Pedantic: 从技术上讲,它TempClass不是一个模板类,而是一个类模板。类模板实际上并不是一个类,它是一个模板,可用于创建本身就是模板类的各个类。因此,TempClass是类模板,TempClass<string>而是模板类——通过实例化模板创建的类。

于 2013-08-21T16:13:42.157 回答
2

模板不是类。是。顾名思义,模板可以帮助编译器创建类。也就是说,如果您有一个模板类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,您也可以将该类设为模板。

于 2013-08-21T16:13:54.910 回答
1

您可以像这样实例化您的模板,例如,为 int 实例化:

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

但是,如果您仍然希望 MYClass 是通用的,您也可以将其设为模板并像这样定义它:

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

并让任何 MyClass 对象实例化来定义参数 T,例如:

MyClass<int> class;
于 2013-08-21T16:13:50.940 回答