0

我正在开发一个简单的Windows::FormsGUI,并且在尝试使用 STLvectorpair通过cliext包时遇到了一些问题。基本上,我用底层实现了一个非常简单(和幼稚)的双向映射cliext::vector< cliext::pair<A, B> >。我现在根本不关心效率,它的所有实例都只会包含少数条目,所以我的幼稚线性搜索不会成为问题。

但是,因为我想在我的Windows::Forms实例中使用这些映射,所以我将它设为托管类。问题是我无法弄清楚如何修改地图的各个条目。

这是基本界面(为简洁起见,我将函数def放在这里):

template<class A, class B>
ref class bimap 
{
public:
    typedef typename cliext::vector< cliext::pair<A, B> >::const_iterator const_it;

    void Insert(const A & a, const B & b)
    {
        bmap.push_back(cliext::pair<A,B>(a,b));
    }

    bool SetInternalByLeftDirect(const A & search_for, const B & set_value)
    {
        for(int i = 0; i < bmap.size(); i++)
        {
             if(bmap[i].first == search_for)
             {
                  bmap[i].second = set_value;
                  return true;
             }
             return false;
        }
    }

    bool SetInternalByLeftWithIterator(const A & search_for, const B & set_value)
     {
        for(const_it it = bmap.begin(); it != bmap.end(); it++)
        {
             if((*it).first == search_for)
             {
                 (*it).second = set_value;
                  return true;
             }
             return false;
        }
    }

    bool SetExternalByLeft(const A & search_for, [Out] B % modify_external)
    {
        for(int i = 0; i < bmap.size(); i++)
        {
             if(bmap[i].first == search_for)
             {
                 modify_external = bmap[i].second;
                 return true;
             }
         }
         return false;
    }

private:
    cliext::vector< cliext::pair<A, B> > bmap;
};

两种SetInternal方法都不起作用。迭代器方法只是给我一个编译错误,它说“第一个左边必须是一个类/结构/联合......你的意思是 - >”但这对我来说没有意义,因为 Visual Studio 已经说它是错误的使用 -> 当我使用 . IntelliSense 甚至在列表中显示“第一”和“第二”。

直接的方法也行不通。它编译并运行,但实际上并没有修改该对的值(即使它返回 true!)。

此外,我包含了 SetExternal 函数,因为它实际上工作正常。这告诉我通过索引搜索bmap向量工作正常,条件bmap[i]很好,它可以设置外部变量。

关于如何编写一种SetInternal方法来修改向量中的单个对有什么想法吗?我还需要一种在外部迭代 bimap 的方法,并且我想使用 const 迭代器(即,具有将 const 迭代器返回到底层的 begin 和 end 的成员方法bmap)但是当我尝试在外部使用它并取消引用iterator 当我尝试在SetInternalByLeftWithIterator上面的方法中取消引用迭代器时,我得到了同样的错误。

谢谢!

4

1 回答 1

0

好吧,事实证明,如果我用 替换我的底层向量cliext::vector< cliext::pair<A,B>^ >并访问这些对,bmap[i]->first然后bmap[i]->second我可以访问和修改。我猜我从使用迭代器中得到的编译器错误是关于某些事情的。

这也允许我上面概述的“直接”和“迭代器”方法。

我仍然不知道为什么原始方法允许访问但不允许修改,但 C++CLI 确实让我头疼。

感谢@crashmstr 的关注!

于 2015-01-23T21:35:58.293 回答