双重和单一类型的通用对称对c ++

呱呱

我正在尝试具有可以处理对称对的模板结构。实现比较运算符以使该结构在std :: map中工作。

到目前为止,我正在使用以下代码:

template<typename T, typename U>
struct SymmetricPair
{
    SymmetricPair() : m_id(std::pair<T,U>()) {}
    SymmetricPair(const SymmetricPair<T,U>& id) : m_id(id) {}
    SymmetricPair(const SymmetricPair<U,T>& id) : SymmetricPair(id.m_id) {}
    SymmetricPair(const std::pair<T,U>& id) : m_id(id) {}
    SymmetricPair(const std::pair<U,T>& id) : m_id(std::pair<T,U>(id.second,id.first)) {}
    SymmetricPair(const T id_t, const U id_u) : m_id(std::pair<T,U>(id_t, id_u)) {}
    SymmetricPair(const U id_u, const T id_t) : m_id(std::pair<T,U>(id_t, id_u)) {

    bool operator< (const SymmetricPair<T,U>& rhs) const { return m_id <  rhs.m_id; }
    bool operator!=(const SymmetricPair<T,U>& rhs) const { return m_id != rhs.m_id; }
    bool operator==(const SymmetricPair<T,U>& rhs) const { return m_id == rhs.m_id; }
    bool operator< (const SymmetricPair<U,T>& rhs) const { return m_id <  SymmetricPair<T,U>(rhs.m_id).m_id; }
    bool operator!=(const SymmetricPair<U,T>& rhs) const { return m_id != SymmetricPair<T,U>(rhs.m_id).m_id; }
    bool operator==(const SymmetricPair<U,T>& rhs) const { return m_id == SymmetricPair<T,U>(rhs.m_id).m_id; }

    std::pair<T,U> m_id;
};

SymmetricPair<std::string,int> pair(std::pair<int,std::string>(42,"bde"));例如,使用效果很好。

不过,我有麻烦(编译时错误)时,模板参数TU是相同的如SymmetricPair<std::string,std::string>因为某些操作被认为已经定义

'SymmetricPair<T,U>::SymmetricPair(const SymmetricPair<T,U> &)' : member function already defined or declared   
'SymmetricPair<T,U>::SymmetricPair(const std::pair<_Ty1,_Ty2> &)' : member function already defined or declared 
'SymmetricPair<T,U>::SymmetricPair(const T,const U)' : member function already defined or declared
'bool SymmetricPair<T,U>::operator <(const SymmetricPair<T,U> &) const' : member function already defined or declared   
 'bool SymmetricPair<T,U>::operator !=(const SymmetricPair<T,U> &) const' : member function already defined or declared 
'bool SymmetricPair<T,U>::operator ==(const SymmetricPair<T,U> &) const' : member function already defined or declared  

我该如何解决?我正在使用VC ++ 2005(所以没有C ++ 11)。

如果还有一种使结构更优雅的方法,我很感兴趣。

安东·萨文(Anton Savin)

我相信最简单的方法是部分专业化,尤其是在C ++ 11不可用的情况下:

template<typename T>
struct SymmetricPair<T, T>
{
    SymmetricPair() : m_id() {}
    SymmetricPair(const SymmetricPair& id) : m_id(id.m_id) {}
    SymmetricPair(const std::pair<T,T>& id) : m_id(id) {}
    SymmetricPair(const T id_t, const T id_u) : m_id(id_t, id_u) {}

    bool operator< (const SymmetricPair<T,T>& rhs) const { return m_id <  rhs.m_id; }
    bool operator!=(const SymmetricPair<T,T>& rhs) const { return m_id != rhs.m_id; }
    bool operator==(const SymmetricPair<T,T>& rhs) const { return m_id == rhs.m_id; }

    std::pair<T,T> m_id;
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将文本转换为单一类型

Ruby:单一类型元素的数组

如何从函数返回单一类型

具有在参数中强制执行的单一类型的C ++参数包

C ++参数包,是否必须具有单一类型的实例?

Haskell:实例参数化类型一个单一类型

使用Serde将两种类型转换为单一类型

聚集值并在同一Java流中转换为单一类型

为什么在Python中不允许单一类型约束?

算法 - 检查给定单词是否存在单一类型

“ Data.Set String”如何(或为什么)不是单一类型?

强制Scala Seq仅使用单一类型(无LUB)

如何从多维数组中获取单一类型的数组(无循环)

字符串中仅允许单一类型的标记

导入已在单一类型导入中定义

从单一类型的文档映射/归约多个值

如何使用这种全速捕获代码仅处理单一类型的崩溃

对Haskell的介绍很温柔:“ ....没有一个单一类型同时包含2和'b'。” 我可以不做这样的类型吗?

mkPair的线性和唯一类型

从通用型未经检查的强制转换为同一类型

任一类型到保留类型的序列的通用序列

从十进制类型到单一类型的转换是缩小转换还是扩大转换?

在单一类型的对象上训练时使用tensorflow进行自定义对象检测的问题

如何找到具有单一类型恰好N个关系的所有节点?

统一类型和非类型模板参数

仅在一类中设置通用类型

SQL计算同一类型中的男性和女性人数

如何处理同一类型中存在和缺失的密钥?

如何将从猫鼬中的find函数获得的数组转换为单一类型的数组(例如,字符串)