如何在模板类标题中使用前向声明修复C ++循环依赖性

时间:2018-12-05 19:41:40

标签: c++ c++11 templates circular-dependency forward-declaration

出于我的面向应用对象课程的教学目的,要求我们开发一个功能齐全的C ++应用程序,而不使用STL或cstring中的任何字符串操作功能(稍后将涉及GUI的SDL)。

在重新开发简单的String和list容器层次结构类时,我遇到了循环依赖问题。以前,我使用前向声明解决了此类问题。但是,这次情况没有按预期进行,这个问题使我现在忙了几个晚上。

这是我遇到的问题的简单UML图。

UML diagram

每个类都有自己的.cpp.hpp文件,除了BaseListItemNotFoundException我在using类声明的上方使用BaseList语句声明。

class BaseListItemNotFoundException: BaseException {
    using BaseException::BaseException;
};

即使这不会添加任何添加的信息(IMHO),也请让我精确说明BaseListHeplList类实际上是使用.ipp和{{1}定义的模板类}。

我省略了一些涉及将环境限制为最小工作示例的其他类(迭代器和Cell通用类层次结构用作列表的有效负载)。为了清楚起见,已删除了使用.hppdefine条件的标题保护。

以下是文件的摘要:

ifndef

BaseList.hpp

#include <cstddef> #include <iostream> #include "Cell.hpp" class HeplString; // Forward declaration #include "BaseException.hpp" class BaseListItemNotFoundException: BaseException { using BaseException::BaseException; }; template<class T> class BaseList { // code };

HeplList.hpp

#include <cstddef> #include "BaseList.hpp" #include "Cell.hpp" template<class T> class HeplList : public BaseList<T> { // code }; #include "HeplList.ipp"

HeplString.hpp

#include <cstddef> #include <iostream> #include <ostream> #include <fstream> #include "HeplList.hpp" class HeplString { // code };

BaseException.hpp

此示例的主要问题是这样的错误:

#include "HeplString.hpp"
#include "BaseList.hpp"

class BaseException {
    // code
};

我不明白我在做什么错。阅读其他类似问题无济于事。

如果需要,我的git存储库及其完整代码可在此处使用:https://github.com/wget/hepl-2-cpp

1 个答案:

答案 0 :(得分:0)

  • #include "BaseException.hpp"添加到BaseList.hpp
  • #include "HeplList.hpp"添加到HeplString.cpp
  • 将向前声明template<class T> class HeplList;添加到HeplString.hpp
  • 现在,您可能需要修改不包含BaseList.hpp标头的其他一些类,因为它们依赖标头HeplString.hpp来做到这一点。