【问题标题】:How to separate inner class of template class into other file如何将模板类的内部类分离到其他文件中
【发布时间】:2011-09-08 08:54:43
【问题描述】:

我想做:

typedef MyTemplateClass<Type01, Type02> TClass;
TClass t;
TClass::InnerClass i;
i.test();

我认为解决方案可能是:

template <typename A, typename B>
class MyTemplateClass
{
public:
    class InnerClass
    {
        //here I can do stuff with A and B
        A test() { return 0; }
    };

    friend class InnerClass;
};

但我想在头文件底部包含单独的 *.inl 文件中包含 ma 模板

如何在其他文件中定义这样的行为?

当我这样做的时候

//file.inl
class InnerClass
{
    //here I can do stuff with A and B
    A test() { return 0; }
};

A 和 B 未定义。

但是

template <typename A, typename B>
class InnerClass
{
...
};

使我的方法模板独立于 MyTemplateClass 类型...

再一次用一句话: 如何在其他文件中制作 MyTemplateClass 的 InnerClass 并提供

TClass::InnerClass i;
i.test();

行为?

【问题讨论】:

    标签: c++ templates inner-classes


    【解决方案1】:

    你不能。简而言之。模板必须在实例化之前完全定义——这意味着无论你做什么,你都必须在模板类中定义内部类。

    【讨论】:

      【解决方案2】:

      它的工作原理与使用非模板时相同:您必须完全限定成员的名称:

      struct outer {
          struct nested;
      };
      
      struct outer::nested {
          int
          test();
      };
      
      int
      outer::nested::test()
      { /* whatever */ }
      

      在你的情况下是:

      template <typename A, typename B>
      class MyTemplateClass {
      public:
          class InnerClass;
      
          friend class InnerClass;
      };
      
      // note the use of the <> brackets
      template<typename A, typename B>
      class MyTemplateClass<A, B>::InnerClass {
      public:
          A
          test();
      };
      
      // ditto
      template<typename A, typename B>
      A
      MyTemplateClass<A, B>::InnerClass::test()
      { return 0; }
      

      确实必须注意定义顺序:如果例如MyTemplateClass 有使用InnerClass 的函数成员,那么InnerClass 的定义必须在使用点可见。

      简单的经验法则:内联所有内容或不内联。要么在MyTemplateClass 内定义所有内联的内容(InnerClass 类定义两个类的函数成员),要么将所有函数成员的所有定义(MyTemplateClass 和 @ 987654329@) 在最后之后 InnerClass 已定义。

      不过不要担心,如果您搞砸了,您的编译器只会很乐意帮助您处理错误消息。

      【讨论】:

        猜你喜欢
        • 2015-08-05
        • 2021-10-10
        • 2016-10-23
        • 1970-01-01
        • 1970-01-01
        • 2017-08-27
        • 1970-01-01
        • 1970-01-01
        • 2020-11-07
        相关资源
        最近更新 更多