在std :: map <cstring,cstring =“”>中插入新对

时间:2016-10-05 13:38:04

标签: c++ stl

我有两个列表和一个要查找的名称。如果要查找的名称不在第一个列表中,则它可能位于第二个列表中,格式略有不同。给出了两种格式之间的转换功能。

  public void Print(string imagePath, int copies)
    {
        var doc = new PrintDocument();
        PrintController printController = new StandardPrintController();

        doc.PrintController = printController;
        doc.PrinterSettings.PrinterName = PhotosConfig.PrinterName;
        doc.PrinterSettings.Copies = (short)copies;
        doc.PrinterSettings.DefaultPageSettings.PaperSize = new PaperSize("10x15x2(4x6\"x2)", 100, 150);
        doc.PrinterSettings.DefaultPageSettings.Margins = new Margins(0,0,0,0);
        doc.DefaultPageSettings.PaperSize = new PaperSize("10x15x2(4x6\"x2)", 100, 150);
        doc.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0);
        doc.OriginAtMargins = true;
        doc.PrintPage += (sender, args) =>
        {
            Image i = Image.FromFile(imagePath);
            //Point p = new Point();
            args.Graphics.DrawImage(i, args.MarginBounds);
        };
        doc.Print();
    }

出现的错误是:

std::map<CString, CString>* convertedNames;

BOOL CSome::SeekNameWithConversion(std::set<CString> names, CString nameToFind)
{
    for (auto it = names.begin(); it != names.end(); ++it)
    {
        if (nameToFind.Compare(*it) == 0) return true;

        auto convertedIt = convertedNames->find(*it);
        if (convertedIt != convertedNames->end() &&
            nameToFind.Compare(convertedIt->second) == 0)
            return true;

        CString justConvertedName = ConvertToTheOtherFormat(nameToFind);
        convertedNames->insert(*it, justConvertedName); // Error here
        return nameToFind.Compare(justConvertedName) == 0;
    }
}

我想知道为什么操作员error C2675: unary '++': 'ATL::CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<_CharType>>>' does not define this operator or a conversion to a type acceptable to the predefined operator 在这里涉及,然后我应该如何处理这个错误。

3 个答案:

答案 0 :(得分:1)

map::insert的第一个参数是迭代器,而不是CString。在内部,该方法试图增加迭代器。这显然是打电话给operator++。您不需要使用此插入过载。当您知道靠近元素插入位置的位置时,它旨在提高性能。只需拨打convertedNames->insert(std::make_pair(*it, justConvertedName))即可。

答案 1 :(得分:0)

所以首先要理解的是模板总是在头文件中完全实现,因为所需的任何类都是用该对象构建的(只要想想std lib是否内置了所有可能的std :: vector实现!)

这意味着公开了模板的实现 - 在这种情况下,那里有一个++。如果你把整个错误打印出来(它会多出几行),你甚至可能会被告知你哪个参数出错了。

无论如何,我们可以看到*它显然是一个CString,但我猜这个

  

...转换为其他格式

可能没有回复你的想法

答案 2 :(得分:0)

std::map的大多数insert函数都需要迭代器。相反,你传递指向对象,(我想是CString):

convertedNames->insert(*it, justConvertedName);
                       ^^^
                       this is a CString, not a std::map<CString,CString>::iterator

如果您想插入一个键值对,请使用地图的value_type代替基本上由键和值组成的std::pair

convertedNames->insert(std::make_pair(*it, justConvertedName));