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::函数计算器)
您是否尝试根据需要声明模板类?