2017-05-07 61 views
1

我已浏览了本网站和其他网站上的数十篇文章,并且找不到解决此特定问题的单个文章。考虑这个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行函数头?


enter image description here

+2

这是因为'NodeType'和'EdgeType'是通用的,而不是实际的类型。你需要说'使用SGraph = SparseGraph ...(IIRC) – Charles

+0

template using SGraph = SparseGraph :: Node,SparseGraph <节点类型,EdgeType> ::边缘>; 不起作用。 (我在类声明中使用了Edge和Node的声明)。我认为这些也不符合实际类型。 – AldenB

+1

您不能将实现放在.cpp文件中,因为编译器必须能够在实例化模板的具体类型的地方看到它。 [看到这个问题](http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file)。 – zett42

回答

0

SGraph::SparseGraph() {}SGraph是一个别名模板,所以你不能没有参数列表中使用它。 您需要使用这样的:

template <typename NodeType, typename EdgeType> 
SGraph<NodeType,EdgeType>::SparseGraph() {} 
+0

这对我的情况没有任何帮助。现在我的函数头看起来像\t模板 typename SGraph :: EdgeIterator&SGraph :: EdgeIterator :: operator - () – AldenB