所以我有一个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的使用无效
答案 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) {
// ..
}