我已浏览了本网站和其他网站上的数十篇文章,并且找不到解决此特定问题的单个文章。考虑这个SparseGraph类我的工作:模板和在.cpp文件中使用声明
Sparse_Graph.h
template <typename NodeType, typename EdgeType>
class SparseGraph
{
//...
public:
SparseGraph();
//...
};
为了缩短在我的.cpp文件中的代码,我希望做类似的东西:
Sparse_Graph的.cpp
#include "Sparse_Graph.h"
template<typename NodeType, typename EdgeType>
using SGraph = SparseGraph<NodeType, EdgeType>;
SGraph::SparseGraph() {}
这对我来说特别重要,因为后来在这个文件我写了作为一个迭代函数声明:
template <typename NodeType, typename EdgeType>
typename SparseGraph<NodeType, EdgeType>::EdgeIterator&
SparseGraph<NodeType, EdgeType>::EdgeIterator::operator++()
(耶)
特别是,在尝试这个时候我得到的错误是:
无效使用模板名 'SGraph' 没有一个参数列表
所以我的问题是:我怎么能得到这样的事情,所以我不必在我的.cpp文件中编写3行函数头?
这是因为'NodeType'和'EdgeType'是通用的,而不是实际的类型。你需要说'使用SGraph = SparseGraph ...(IIRC) –
Charles
template using SGraph = SparseGraph :: Node,SparseGraph <节点类型,EdgeType> ::边缘>; 不起作用。 (我在类声明中使用了Edge和Node的声明)。我认为这些也不符合实际类型。 –
AldenB
您不能将实现放在.cpp文件中,因为编译器必须能够在实例化模板的具体类型的地方看到它。 [看到这个问题](http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file)。 – zett42