Как разделить внутренний класс класса шаблона на другой файл - PullRequest
3 голосов
/ 04 июня 2011

Я хочу сделать:

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файла заголовка

как определить такое поведение в другом файле?

, когда я просто

//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 ...

Еще раз в одном предложении: Как сделать InnerClass MyTemplateClass в другом файле с предоставлением

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

поведение?

Ответы [ 2 ]

7 голосов
/ 04 июня 2011

Работает так же, как и при использовании не-шаблона: вы должны полностью указать имя участника:

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

Вы do должны быть осторожны с порядком определения: если, например, MyTemplateClass имеет функции-члены, которые используют InnerClass, тогда определение InnerClass должно быть видно в точке использования.

Простое правило: встроить все или ничего. Либо вы определяете все встроенное (InnerClass определение класса и члены-функции обоих классов) внутри MyTemplateClass, либо вы помещаете все определения всех членов функции (как MyTemplateClass, так и * 1019). *) в самом конце после определения InnerClass.

Не беспокойтесь, если вы все испортите, ваш компилятор будет только рад помочь вам с сообщениями об ошибках.

4 голосов
/ 04 июня 2011

Вы не можете. В двух словах. Шаблоны должны быть полностью определены перед созданием экземпляра - это означает, что что бы вы ни делали, вам все равно придется определять внутренний класс в классе шаблона.

...