2015-08-17 3 views
2

Я делаю пересылку деклараций в файлах заголовков и включая фактические файлы классов в cpp. Но я столкнулся с проблемами, когда классы шаблонный:Передовая декларация класса (sdk), содержащая шаблон

class MyClass { 
public: 
    MyClass(); 
    void aFunction(); 
private: 
    QList<int> m_member; 
}; 

Чтобы получить его, чтобы построить мне нужно дать этот класс информацию о QList. Я пробовал:

class QList; 

error: template argument required for 'class QList' 

Я пытался (потому что мне нужно будет только QList целых чисел в данном классе):

class QList<int>; 

error: specialization of 'QList<int>' after instantiation 

Я посмотрел эти ошибки, но нашел только вопросы с людьми, имеющими проблемы при создании класса шаблонов, ничего не найдено о форвардных объявлениях.

Если ничего более не работает, я могу #include <QList> в файле заголовка и отказаться от прямого объявления - но я хотел бы понять эту проблему.

Эта опция также предлагается в наиболее популярный вопрос о template classes forward declarations:

Просто #include <list> и не беспокоиться об этом.

Я не понимаю other answers ...

+1

Если вы хотите, чтобы 'QList ' как член вашего класса, полная декларация необходима в любом случае (потому что компилятор должен будет вычислить размер вашего класса). С помощью прямого объявления вы можете иметь указатели или ссылки, но не намного больше. –

+0

@BoPersson, как он может это сделать, если размер списка неизвестен? – Thalia

+1

Объект 'QList ' всегда будет иметь тот же размер. «Int' в списке будет выделен отдельно. –

ответ

1

Вы можете переадресовать объявить шаблонный класс, например:

template<typename> 
class QList; 

Но это не будет работать, если вы объявляете элемент этого типа (т.е. m_member), который не является ссылкой или указателем.

+0

О, если я хочу этого, мои личные члены должны быть ссылками ... шляпа будет работать ... я должен объявить их как 'QList * m_list'? – Thalia

+0

@Thalia, справа (указатель или ссылка), потому что, как и при любом прямом объявлении, он не определяет полный тип. – imreal

Смежные вопросы