通过 cliext 与 C++CLI .NET 和 STL 的兼容性问题
Compatibility issue with C++CLI .NET and STL via cliext
我正在开发一个简单的 Windows::Forms
GUI,我 运行 遇到了一些尝试通过 cliext
包使用 STL vector
和 pair
的问题.基本上,我实现了一个非常简单(和幼稚)的双向映射,其中包含一个底层 cliext::vector< cliext::pair<A, B> >
。我现在根本不关心效率,它的所有实例都只包含少量条目,所以我天真的线性搜索不会成为问题。
但是,因为我想在我的 Windows::Forms
实例中使用这些映射,所以我将其设为托管 class。问题是我不知道如何修改地图的各个条目。
这是基本界面(为简洁起见,我将函数 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
方法都不起作用。迭代器方法只是给我一个编译错误,它说 "left of first must be a class/struct/union..did you mean ->" 但这对我来说没有意义,因为 Visual Studio 已经说使用 -> 是错误的,当我使用 . IntelliSense 甚至在列表中显示 "first" 和 "second"。
直接的方法也不行。它编译并运行,但实际上并没有修改该对的值(即使它 return 为真!)。
此外,我包含了 SetExternal 函数,因为它实际上工作正常。这告诉我通过索引搜索 bmap
向量工作正常并且 bmap[i]
上的条件很好并且它可以设置外部变量。
关于如何编写 SetInternal
方法来修改向量中的单个对,有什么想法吗?我还需要一种在外部迭代 bimap 的方法,我想使用一个 const 迭代器(即,有成员方法 return 一个 const 迭代器到底层 bmap
的开始和结束)但是当我尝试在外部使用它并取消引用迭代器我得到了与我尝试在上面的 SetInternalByLeftWithIterator
方法中取消引用迭代器时相同的错误。
谢谢!
嗯,事实证明,如果我用 cliext::vector< cliext::pair<A,B>^ >
替换我的基础向量并访问 bmap[i]->first
和 bmap[i]->second
对,那么我既可以访问也可以修改。我想我从使用迭代器得到的编译器错误是有问题的。
此外,这还允许我在上面概述的 "direct" 和 "iterator" 方法。
我仍然不知道为什么原来的方法允许访问但不允许修改,但是C++CLI确实让我头疼。
感谢@crashmstr 的关注!
我正在开发一个简单的 Windows::Forms
GUI,我 运行 遇到了一些尝试通过 cliext
包使用 STL vector
和 pair
的问题.基本上,我实现了一个非常简单(和幼稚)的双向映射,其中包含一个底层 cliext::vector< cliext::pair<A, B> >
。我现在根本不关心效率,它的所有实例都只包含少量条目,所以我天真的线性搜索不会成为问题。
但是,因为我想在我的 Windows::Forms
实例中使用这些映射,所以我将其设为托管 class。问题是我不知道如何修改地图的各个条目。
这是基本界面(为简洁起见,我将函数 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
方法都不起作用。迭代器方法只是给我一个编译错误,它说 "left of first must be a class/struct/union..did you mean ->" 但这对我来说没有意义,因为 Visual Studio 已经说使用 -> 是错误的,当我使用 . IntelliSense 甚至在列表中显示 "first" 和 "second"。
直接的方法也不行。它编译并运行,但实际上并没有修改该对的值(即使它 return 为真!)。
此外,我包含了 SetExternal 函数,因为它实际上工作正常。这告诉我通过索引搜索 bmap
向量工作正常并且 bmap[i]
上的条件很好并且它可以设置外部变量。
关于如何编写 SetInternal
方法来修改向量中的单个对,有什么想法吗?我还需要一种在外部迭代 bimap 的方法,我想使用一个 const 迭代器(即,有成员方法 return 一个 const 迭代器到底层 bmap
的开始和结束)但是当我尝试在外部使用它并取消引用迭代器我得到了与我尝试在上面的 SetInternalByLeftWithIterator
方法中取消引用迭代器时相同的错误。
谢谢!
嗯,事实证明,如果我用 cliext::vector< cliext::pair<A,B>^ >
替换我的基础向量并访问 bmap[i]->first
和 bmap[i]->second
对,那么我既可以访问也可以修改。我想我从使用迭代器得到的编译器错误是有问题的。
此外,这还允许我在上面概述的 "direct" 和 "iterator" 方法。
我仍然不知道为什么原来的方法允许访问但不允许修改,但是C++CLI确实让我头疼。
感谢@crashmstr 的关注!