通过cliext与C ++ CLI .NET和STL的兼容性问题

时间:2015-01-23 18:31:39

标签: .net c++-cli cliext

我正在开发一个简单的Windows::Forms GUI,并且在尝试通过vector包使用STL paircliext时遇到了一些问题。基本上,我实现了一个非常简单(和天真)的双向映射,其中包含基础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方法都不起作用。迭代器方法只是给我一个编译错误,它说'#34;第一个左边必须是一个类/结构/联合...你的意思是 - &gt;&#34;但这对我没有意义,因为Visual Studio已经说过使用它是错误的 - &gt;当我用的时候智能感知甚至向我展示了第一个&#34;和&#34;第二&#34;在列表中。

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:0)

嗯,事实证明,如果我用cliext::vector< cliext::pair<A,B>^ >替换我的基础向量并使用bmap[i]->firstbmap[i]->second访问对,那么我可以访问和修改。我想我从使用迭代器得到的编译器错误是在做什么。

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

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

感谢@crashmstr的关注!