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

rel*_*xxx 3 c++ templates inner-classes

我想要做:

typedef MyTemplateClass<Type01, Type02> TClass;
TClass t;
TClass::InnerClass i;
i.test();
Run Code Online (Sandbox Code Playgroud)

我认为解决方案可能是:

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;
};
Run Code Online (Sandbox Code Playgroud)

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

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

当我做的时候

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

A和B未定义.

template <typename A, typename B>
class InnerClass
{
...
};
Run Code Online (Sandbox Code Playgroud)

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

再一句话:如何在提供的其他文件中创建MyTemplateClass的InnerClass

TClass::InnerClass i;
i.test();
Run Code Online (Sandbox Code Playgroud)

行为?

Luc*_*ton 7

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

struct outer {
    struct nested;
};

struct outer::nested {
    int
    test();
};

int
outer::nested::test()
{ /* whatever */ }
Run Code Online (Sandbox Code Playgroud)

在你的情况下,是:

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; }
Run Code Online (Sandbox Code Playgroud)

必须要警惕的定义顺序是:如果如MyTemplateClass具有函数成员使用InnerClass,那么的定义InnerClass必须是在使用点可见.

简单的经验法则:内联一切或无内容.要么你定义的一切行内的(InnerClass类定义这两个类的成员函数)内MyTemplateClass,或者你把所有函数成员(双方的所有定义MyTemplateClassInnerClass)在最后 InnerClass已被定义.

不要担心,如果你搞砸了你的编译器只会很乐意帮你解决错误信息.