为刚刚声明的类定义stl容器。

时间:2013-06-24 22:27:48

标签: c++ stl friend-class

我正在尝试为我的研究实现有限元素代码。我需要创建一个将材料与其名称相关联的地图,以便我可以按名称访问它们。 从主类的头文件中,我定义了以下内容:

/// Friend class definition for the materials
friend class Material; 
/// Class definition for the materials
class Material; 

/// Creates a dictionary of elementsets vs material names
std::map<std::string,std::string>  _material_assignment; 

/// Container to hold the material names of all the materials
std::map<std::string,Material> _materials; 

主类的实现编译。但是,当makefile到达主文件时,我收到以下错误

Error: 'std::pair<_T1, _T2>::second' has incomplete type
       _T2 second;                /// @c second is a copy of the second object
       ^
In file included from src/main.C:5:0:
src/diff_code.h:228:9: error: forward declaration of 'class DiffCode::Material'
   class Material;

我如何解决这个问题。我的代码的所有其他文件都包含重要代码类的头文件正在编译。

谢谢!

2 个答案:

答案 0 :(得分:3)

该标准要求用于实例化库中模板的类型在实例化时完成,并记录一些例外(例如std::shared_ptr<T>)。如果不提供Material类型的完整定义,则无法修复代码。那就是:你不能实例化一个刚刚声明的类型的stl容器。

答案 1 :(得分:1)

您必须定义完整的课程。但是,您可以在容器中放置Material*,或者如果这不够好,您可以在容器中放置std::unique_ptr<Material>,这样就可以为您处理内存管理,但仍允许您转发 - 决定你的幸福之路。