2012-04-05 4 views
1

Я пытаюсь переслать объявление класса, который является производным от класса шаблона, который также должен быть объявлен вперед.Как переслать объявление класса, полученного из базового класса с прямым объявлением шаблона?

Вот пример из классов:

class TType { 
public: 
    TType() { } 
}; 

template<typename T> 
class Base { 
public: 
    Base() { } 
}; 

class Derived : public Base<TType> { 
public: 
    Derived() { } 
}; 

Вот неудачная догадка, что мне нужно:

class TType; 
template<typename T> class Base; 
class Derived : public Base<TType>; // This fails 
Derived* pDerived; 

ответ

5

Просто вперед объявить имя класса:

class Derived; 

Вы не можете включать больше информации о классе в его объявление; базовые классы, члены и т. д. могут быть объявлены только в определении класса.

Это форвардное объявление может использоваться для выполнения различных действий, включая декларирование указателей или ссылок (например, pDerived в вашем примере), а также объявление функций с Derived в качестве аргумента или типа возврата. Если вам нужно сделать что-либо, что нужно знать размеру класса, базовым классам или членам, то вам понадобится полное определение.

+0

Вы, конечно, правы, но когда я попробовал это, и это не получилось. Вот моя ошибка, в прямом объявлении я сделал 'namespace {class Derived};', а затем 'class Derived;'. Очевидно, использование 'namespace', чтобы сказать что-то не имеет пространства имен, не то же самое, что просто skpping' namespace', поэтому компилятор говорил мне, что это неоднозначно. – Solx