如何在头文件中声明类模板(由于循环依赖)

时间:2018-10-04 09:55:42

标签: c++ templates circular-dependency

拥有

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 :(得分:0)

转发声明语法为

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> {
//...
};

答案 1 :(得分:0)

您的示例没有循环依赖项。 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;
};