【问题标题】:Making an object of template class制作模板类的对象
【发布时间】:2013-08-24 02:45:06
【问题描述】:

我定义了一个模板类:

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

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

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

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

谢谢。

【问题讨论】:

  • 我没听懂。你想达到什么目的?以通用方式创建一个类 (MyClass) 还是仅实例化一种特定类型的模板对象?对于第二种情况,要将其实例化为 int,只需将 object 定义为 TempClass&lt;int&gt; temp;
  • T 本身不是一个类型,它是一个正式的“类型参数”。如果你说例如TempClass&lt;int&gt; temp; 编译器将为新类 TempClass&lt;int&gt; 生成代码,该类对应于模板 TempClass,所有“T”实例都替换为“int”,temp 将成为那种新型。现在应该清楚你不能“通过T”,那么你能澄清一下你想做什么吗?
  • @Tomás Badan 实际上我想要实现的是从 MyClass 调用在 TempClass 中定义的函数。
  • @gx_ 感谢您的回答。那么如果我需要调用3种不同类型的函数,我需要有3个模板类的对象来实现吗?
  • @Mike 你的例子没有为我提供足够的信息准确的答案......(如果你的“3 种类型”在你为MyClass 编写代码时是固定的并且是已知的,那么也许是的(但是不一定是 member 变量,如果要调用的函数是 static,则您不需要对象),否则您可能希望将 MyClass 本身设为模板,如下面的答案所示... )

标签: c++ qt templates object


【解决方案1】:

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

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

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

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

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

MyClass<int> class;

【讨论】:

    【解决方案2】:

    模板不是类。是。顾名思义,模板可以帮助编译器创建类。也就是说,如果你有一个模板类template&lt;typename T&gt; 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 的通用版本,您也可以将该类设为模板。

    【讨论】:

    • 感谢您的详细解释。这是一个有价值的答案。
    • @Mike 我的目标是提供“为什么你必须这样做”的完整描述,而不是 “你必须这样做” 答案。我认为你必须这样做答案必须被否决,即使答案是正确的。当您在 stackoverflow 等网站上发布问题时,您需要详细描述您的问题,然后列出可能的解决方案。
    • 好的,我以后会考虑这个事实。谢谢。
    【解决方案3】:

    如果您也希望 MyClass 成为模板,您可以这样做:

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

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

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

    struct MyClass {
        TempClass<string> temp;
    };
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-09
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      相关资源
      最近更新 更多