【问题标题】:templates and using declarations inside .cpp files模板和使用 .cpp 文件中的声明
【发布时间】:2017-05-07 16:52:42
【问题描述】:

我浏览了该网站和其他网站上的数十篇文章,但找不到一篇解决这个特定问题的文章。考虑一下我正在研究的这个 SparseGraph 类:

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 行函数标题?


【问题讨论】:

  • 那是因为NodeTypeEdgeType 是通用类型而不是实际类型。你需要说using SGraph = SparseGraph&lt;ActualNodeType, ActualEdgeType&gt;... (IIRC)
  • 模板 using SGraph = SparseGraph::Node, SparseGraph::Edge>;不工作。 (我在类声明中有一个 Edge 和 Node 的 using 声明)。我认为这些也不符合实际类型。
  • 您不能将实现放在 .cpp 文件中,因为编译器必须能够在为具体类型实例化模板的地方看到它。 See this question.
  • 一点修正。您不能将 generic 实现放在 .cpp 文件中,但您可以改为使用 explicit instantiation
  • 正确。这就是为什么大多数模板库只有标头。

标签: c++ templates using


【解决方案1】:

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

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

【讨论】:

  • 这对我的情况没有任何帮助。现在我的函数头看起来像模板 typename SGraph::EdgeIterator& SGraph::EdgeIterator::operator--()
猜你喜欢
  • 1970-01-01
  • 2022-06-18
  • 2021-09-14
  • 1970-01-01
  • 2015-09-15
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 2019-10-15
相关资源
最近更新 更多