如何将模板类的内部类分成其他文件

时间:2011-06-04 12:42:18

标签: c++ templates inner-classes

我想这样做:

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;
};

但我希望将ma模板放在头文件

底部的单独* .inl文件中

如何在其他文件中定义此类行为?

当我做的时候

//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();

行为?

2 个答案:

答案 0 :(得分:7)

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

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的定义。

简单的经验法则:内联一切或无内容。您可以在InnerClass内定义内联的所有内容(MyTemplateClass类定义两个类的函数成员),或者放置所有函数成员的所有定义(两者都是{已定义 MyTemplateClass后的最后{1}}和InnerClass}。

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

答案 1 :(得分:4)

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