如何在函数模板中使用前向声明数据成员? (C ++)

时间:2014-10-14 13:06:36

标签: c++ templates

所以我有一个Class,我在其中使用前向声明类的数据库。现在我需要一个函数模板用于我的类,但函数模板需要在头文件中实现,所以我无法访问我的成员。我该如何解决这个问题?

以下是我的一些代码

class Cell;
class Node;


class Wall : public WallAttributes
{
public:
    ///
    virtual ~Wall() {}

private:
    Cell*             m_c1;                ///<
    Cell*             m_c2;                ///<
    Node*             m_n1;                ///<
    Node*             m_n2;                ///<
    unsigned int      m_wall_index;        ///<

private:
    mutable double    m_length;            ///< Length is tracked lazily.
    mutable bool      m_length_dirty;      ///< Marks length dirty.

private:
    friend class cereal::access;
    template<class Archive>
    void save(Archive & archive) const
    {
        archive(m_c1->GetIndex());
        archive(m_c2->GetIndex());
        archive(m_n1->GetIndex());
        archive(m_n2->GetIndex());
        archive(m_wall_index);
        archive(m_length);
        archive(m_length_dirty);
    }

    template<class Archive>
    void load(Archive & archive)
    {
    //Todo
    }

};

出现错误:无效类型Cell的使用无效

2 个答案:

答案 0 :(得分:1)

您可以将模板定义移动到源文件(Wall.cpp)。

将标题更改为:

class Wall : public WallAttributes{
private:
    template<class Archive>
    void save(Archive & archive) const;

    template<class Archive>
    void load(Archive & archive);
}

在Wall.cpp上:

template<class Archive>
void save(Archive & archive) const
{
    (...)
}

template<class Archive>
void load(Archive & archive)
{
    (...)
}

由于模板函数是私有的,我假设它们只会在Wall.cpp中使用。但如果不是这种情况,您可以使用模板定义创建一个中间cpp文件,例如Wall-templates.cpp,并在Wall.cpp中包含cpp文件。

答案 1 :(得分:0)

尝试这种方法:

class Wall : public WallAttributes {
// ...
private: 
  template<class Archive>
  void load(Archive& archive);
};

// ...

#include "wall.tpp" // templates definitions

然后在wall.tpp

template<class Archive>
void Wall::load(Archive& archive) {
  // ..
}

然后,您可以在Cell之前或该文件中包含#include "wall.tpp"的标头。

或者你也可以使用这种方法:

wall.tpp

template<>
void Wall::load<Cell>(Cell& archive); // declare template specialization for Cell type

wall.cc

template<> // define template specialization
void Wall::load(Cell& archive) {
  // ..
}