C++ 模板类依赖性问题

C++ 模板类依赖性问题,c++,templates,dependencies,C++,Templates,Dependencies,我有两门课,DynamicCollection和DictionaryDictionary继承自DynamicCollection,这两个类都是模板。下面的示例如下所示: template <typename ValueType> class DynamicCollection; template <typename KeyType, typename ValueType> class Dictionary : public DynamicCollection<Ke

我有两门课,
DynamicCollection
Dictionary
Dictionary
继承自
DynamicCollection
,这两个类都是模板。下面的示例如下所示:

template <typename ValueType>
class DynamicCollection;

template <typename KeyType, typename ValueType>
class Dictionary : public DynamicCollection<KeyValuePair<KeyType, ValueType>>;
template <typename Selector>
Dictionary<Selector, ICollection<ValueType>*>* GroupBy( std::function<Selector(ValueType)> evaluator );
template <typename ValueType, typename Selector>
Dictionary<Selector, ICollection<ValueType>*>* DynamicCollection<ValueType>::GroupBy( std::function<Selector( ValueType )> evaluator );
所以我遇到的问题是循环依赖,我不知道如何重写它才能工作。我曾尝试在
DynamicCollection
标题中声明
字典
,然后在
字典
标题中定义方法,但后来我遇到了这种奇怪的情况:

template <typename Selector>
Dictionary<Selector, ICollection<ValueType>*>* DynamicCollection::GroupBy( std::function<Selector( ValueType )> evaluator );
因为当我这样定义它时:

template <typename ValueType>
class DynamicCollection;

template <typename KeyType, typename ValueType>
class Dictionary : public DynamicCollection<KeyValuePair<KeyType, ValueType>>;
template <typename Selector>
Dictionary<Selector, ICollection<ValueType>*>* GroupBy( std::function<Selector(ValueType)> evaluator );
template <typename ValueType, typename Selector>
Dictionary<Selector, ICollection<ValueType>*>* DynamicCollection<ValueType>::GroupBy( std::function<Selector( ValueType )> evaluator );
模板
Dictionary*DynamicCollection::GroupBy(std::function evaluator);
我得到一个错误,说它找不到匹配的声明(这对我来说是有意义的)


因此,我的问题是:如何正确声明和定义此方法

从语言的角度来看,您可以在定义
DynamicCollection
类型之前声明
Dictionary
模板,然后在定义
DynamicCollection::GroupBy

也就是说,虽然您可以让它编译,但仍然存在循环依赖关系,这通常是设计中的一种味道。有不同的技术可以删除循环依赖项,最常见的技术是拆分成更多的组件,并将代码的一部分移动到更高/更低的级别。在这种特殊情况下,您可能需要考虑在代码< >动态集合/<代码>之外编写<代码> GROPEB/<代码>一个免费函数或实用程序,这样依赖关系将变成:

    GroupBy -- free function or component
       v
   Dictionary
       v
DynamicCollection

如果没有完整的设计视图,甚至没有要解决的问题,很难说这是否是最好的解决方案,但不管怎样,通用方法都应该有效。

奇怪的是,下面的代码解决了我的问题。我在
DynamicCollection
标题中向前声明这个
Dictionary
,并像通常一样在类中声明方法。然后,我在
字典
标题中使用下面的声明定义方法,然后一切正常。一行上有两个模板声明。我想知道这是怎么回事

template <typename ValueType> template <typename Selector>
Dictionary<Selector, ICollection<ValueType>*>* DynamicCollection<ValueType>::GroupBy( std::function<Selector( ValueType )> evaluator )
模板
Dictionary*DynamicCollection::GroupBy(std::函数计算器)

您是否尝试根据需要声明模板类?