как объявить шаблон класса в заголовочном файле (из-за циклических зависимостей) - PullRequest
0 голосов
/ 04 октября 2018

Имея

Bar.h

template<class T>
class Bar<T> {
//...
}

Foo.h

template<T>
class Bar<T>;
//#include "Bar.h" removed due of circular dependencies, I include it in .cpp file

template<class T>
class Foo {
...
private:
    Bar<T> *_bar;
}

Как видите, мне нужно включить bar.h, но я могу 'я делаю это в моем проекте по причинам циклических зависимостей ..

Так что, как обычно, я просто пишу определение в .h и реализацию в .cpp. Но у меня есть некоторые проблемы с этим примером, потому что я незнать синтаксис класса с шаблоном ..

Есть ли синтаксис для этого?Я получаю следующую ошибку компилятора с текущим примером:

Bar is not a class template

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Ваш пример не имеет круговой зависимости.Bar никак не зависит от Foo.Вы можете определить шаблоны в следующем порядке:

template<class T> class Bar {};

template<class T>
class Foo {
private:
    Bar<T> *_bar;
};

Если вы хотите разделить определения на два файла, вы можете выполнить приведенный выше порядок следующим образом:

// bar:
template<class T>
class Bar {};

// foo:
#include "bar"

template<class T>
class Foo {
private:
    Bar<T> *_bar;
};
0 голосов
/ 04 октября 2018

Синтаксис прямого объявления:

template<T> class Bar;

Таким образом, ваш код становится:

Foo.h

template<T> class Bar;

template<class T>
class Foo {
...
private:
    Bar<T> *_bar;
};

#include "Foo.inl"

Foo.inl

#include "bar.h"

// Foo implementation ...

Bar.h

template<class T>
class Bar<T> {
//...
};
...