与 std::pairs 初始化混淆

Confusion with std::pairs initialization

下面的代码在编译时会产生以下错误:

error C2439: 'std::pair::first' : member could not be initialized

error C2440: 'initializing' : cannot convert from 'int' to 'const AnalyticsToolKit::ParcelPassingLogic::ParticipantNode &'

然而,当我注释掉底线时,没有这样的错误,所以这对从散列传回的方式肯定有问题table?

P.S。我也是用的Qt包,QHash和unordered_map基本一样,QStrings和std::string一样,但是可以作为hash key

任何帮助将不胜感激!!

struct ParticipantNode
{
    QHash<const QString, std::pair<const ParticipantNode&, double> > soldToParticipants;
};

QHash<QString, QHash<QString, ParticipantNode> > mGraphs;


QString buyer = "someString";
QString seller = "someString";
QString security = "someString";
double value = someDouble;

QHash<QString, ParticipantNode>& tradeGraph = mGraphs[security];
ParticipantNode& sellerNode = tradeGraph[seller];
QHash<const QString, std::pair<const ParticipantNode&, double> > sellersSoldToParticipants = sellerNode.soldToParticipants;

std::pair<const ParticipantNode&, double> tradeDetails = sellersSoldToParticipants[buyParticipant];

我对 QT 一无所知,但如果 QHash 类似于 unordered_map,那么问题出在您使用 operator[] 的地方。如果给定键不存在,该函数将为给定键插入一个默认构造的值。为此,值类型必须是默认可构造的,并且:

std::pair<const ParticipantNode&, double>

不可默认构造,因为 const ParticipantNode& 不可默认构造。

您将不得不使用 find() 或与之等效的 QT:

auto it = sellersSoldToParticipants.find(buyParticipant);
if (it != sellersSoldToParticipants.end()) {
    std::pair<const ParticipantNode&, double> tradeDetails = it->second;
}