我正在用C ++创建自己的树状容器。这是我如何想象其结构的概述:

//==========================================================
// Concept
//==========================================================
//
// RootNode -> Attributes
//          -> Nodes -> Attributes
//                   -> Nodes -> Attributes
//                            -> Nodes
//
// etc...
//==========================================================


我现在已经将类型命名为DataTree。标头看起来像这样:

#pragma once

#include <map>
#include <set>
#include <string>

namespace LB{
    class DataTree;
    struct DataTreeComparitor{
        bool operator () (DataTree const & lhs, DataTree const & rhs) const;
        bool operator () (std::string const & lhs, DataTree const & rhs) const;
        bool operator () (DataTree const & lhs, std::string  const & rhs) const;
    };
    class DataTree{
    public:
        template <typename Type>
        Type getAttribute(std::string const & name) const{
            static_cast<Type>(*m_attributes.find(name));
        }

        DataTree getChild(std::string const & name) const;

        std::string getName(void) const;

    private:
        std::string m_name;

        std::multimap<std::string, std::string> m_attributes;
        std::multiset<DataTree, DataTreeComparitor> m_children;
    };
}


我想使用m_children在容器std::string中查找元素,该DataTreeComparitor将与getName()的结果进行比较。

但是,当尝试在find()上调用m_children时,我从mingw32收到以下错误:

    C:/Users/Joshua/Documents/BitBucket/LBC++/LBC++/DataTree.cpp:17:31: error: no matching function for call to 'std::multiset<LB::DataTree, LB::DataTreeComparitor>::find(const string&) const'


而这使用MSVC

    2   IntelliSense: no instance of overloaded function "std::multiset<_Kty, _Pr, _Alloc>::find [with _Kty=LB::DataTree, _Pr=LB::DataTreeComparitor, _Alloc=std::allocator<LB::DataTree>]" matches the argument list
            argument types are: (const std::string)
            object type is: const std::multiset<LB::DataTree, LB::DataTreeComparitor, std::allocator<LB::DataTree>> c:\Users\Joshua\Documents\Visual Studio 2013\Projects\Project1\Project1\Source.cpp  46  21  Project1


这是实现,问题行通过注释指示:

#include "DataTree.h"

namespace LB{
    bool DataTreeComparitor::operator () (DataTree const & lhs, DataTree const & rhs) const{
        return lhs.getName() < rhs.getName();
    }

    bool DataTreeComparitor::operator () (std::string const & lhs, DataTree const & rhs) const{
        return lhs < rhs.getName();
    }

    bool DataTreeComparitor::operator () (DataTree const & lhs, std::string  const & rhs) const{
        return lhs.getName() < rhs;
    }

    DataTree DataTree::getChild(std::string const & name) const{
        return *m_children.find(name); // problem line
    }
}


我一辈子都无法弄清为什么编译器没有使用DataTreeComparitorDataTreestd::string进行比较。

我的问题是,为什么不这样做?如您所见,我尝试将运算符重载添加到比较器中,其中std::string既是左手运算符,也是右手运算符。

注意:

我知道DataTree类型缺少许多基本功能;这项工作仍在进行中。

最佳答案

问题是您正在使用multiset<DataTree, DataTreeComparitor>::find参数调用std::string。那是行不通的,因为它需要一个DataTree,并且没有从std::stringDataSet的转换。

您可以通过添加隐式转换构造函数来解决此问题:

class DataTree{
public:
  DataTree(const std::string& name) : m_name(name) {}
  ....
};

07-26 02:24