我正在用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
}
}
我一辈子都无法弄清为什么编译器没有使用
DataTreeComparitor
将DataTree
与std::string
进行比较。我的问题是,为什么不这样做?如您所见,我尝试将运算符重载添加到比较器中,其中
std::string
既是左手运算符,也是右手运算符。注意:
我知道
DataTree
类型缺少许多基本功能;这项工作仍在进行中。 最佳答案
问题是您正在使用multiset<DataTree, DataTreeComparitor>::find
参数调用std::string
。那是行不通的,因为它需要一个DataTree
,并且没有从std::string
到DataSet
的转换。
您可以通过添加隐式转换构造函数来解决此问题:
class DataTree{
public:
DataTree(const std::string& name) : m_name(name) {}
....
};