Предварительное объявление вложенного класса для наследования шаблонов - PullRequest
1 голос
/ 11 ноября 2009

Как правильно наследовать от класса шаблона, если аргумент шаблона является вложенным классом внутри класса наследования?

class SomeClass : public TemplateClass<NestedClass>
{
     class NestedClass {};
};

Ответы [ 3 ]

4 голосов
/ 11 ноября 2009

Нет способа сделать это конкретно. Если вам действительно нужно наследовать от TemplateClass<NestedClass>, вам придется переместить объявление NestedClass из SomeClass.

0 голосов
/ 11 ноября 2009

Я не вижу, как вы могли бы сделать это правильно. Есть это:

template<class T> class TemplateClass {};

class NestedClass {};

class SomeClass : public TemplateClass<NestedClass>
{
    typedef NestedClass NestedClass;
};

но это только притворство ...

0 голосов
/ 11 ноября 2009

Вы должны как минимум объявить NestedClass:

class NestedClass;
template<class T> class TemplateClass{};
class SomeClass : public TemplateClass<NestedClass>
{
     class NestedClass{};
};

Это работает. Протестировано на MinGW c ++ для Windows.

Обновление: @ Джон Я попробовал следующее на gcc версии 3.4.5 в Windows XP:

#include <iostream>

class NestedClass;
template<class T> class TemplateClass{};
class SomeClass : public TemplateClass<NestedClass>
{
public:
     class NestedClass{ 
     public: 
        int a; 
        static int test(){ return 100; }
     };
     NestedClass nc;
};

int main(){
 SomeClass sc;
 sc.nc.a = 10;
 std::cout<< sc.nc.a << std::endl;
 std::cout<< sc.nc.test() << std::endl;
}

И я получаю следующий вывод: 10 100

Но, я думаю, что автор задумал (как предложил @jon) на самом деле это:

class SomeClass::NestedClass;
template<class T> class TemplateClass{};
class SomeClass : public TemplateClass<SomeClass::NestedClass>
{
public:
     class NestedClass{};
     NestedClass nc;
};

И это не работает. Причина в том, что для того, чтобы иметь возможность объявить SomeClass :: NestedClass в спецификации шаблона, SomeClass должен был быть объявлен. Но мы пытаемся сделать именно это - следовательно, мы получаем циклическую зависимость.

Так что, думаю, ответ @ jon лучше всего решит эту проблему.

...