gpt4 book ai didi

c++ - 使用类型成员作为 std::multiset 中的键

转载 作者:行者123 更新时间:2023-11-28 02:43:35 25 4
gpt4 key购买 nike

我正在用 C++ 创建自己的树状容器。以下是我想象中的结构概述:

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

我暂时将类型命名为 DataTree。 header 如下所示:

#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;
};
}

我想使用 std::string 在容器 m_children 中查找元素,DataTreeComparitor 将与 getName()

但是,当尝试在 m_children 上调用 find() 时,我从 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>::findstd::string范围。那行不通,因为它需要 DataTree ,并且没有来自 std::string 的转换至 DataSet .

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

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

关于c++ - 使用类型成员作为 std::multiset 中的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25106033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com