2017-10-05 35 views
0

我在创建可在C++/CLI的类中访问所有函数的数组时遇到了很多麻烦。由于它是C++/CLI,std :: vector不起作用。 Boost :: array抛出一个有关托管类型使用的非托管类型的错误。我不想使用指针数组,因为我想获得数组的大小。 System :: List太慢(我的程序中每个ms都很重要,但是如果它有帮助,我不关心写入阵列的速度,一次只读取一个元素的速度)。 cliext :: vector是最接近我得到这个工作。如何在C++/CLI中创建全局可访问的二维数组

我用int创建了一个单维cliext :: vector,它工作。但是,当我试图使用

cliext::vector<cliext::vector<int>> test; 

它失败,出现类似的错误,如下所示。这里是我用它在我的课:

标题:

cliext::vector<Color> test; 

我在构造函数中设置值是:

test = gcnew cliext::vector<Color>(5); 
test[0] = Color(255,255,255); 

然后我试图让这将存储类3变量的颜色。这是头文件。构造函数只是设置了R,G,B值:

namespace FrameCalculator { 
class Color { 
public: 
    Color(int r, int g, int b); 

    int r; 
    int g; 
    int b; 
}; 

但是这并不工作,并把它扔到下面的错误:

1>E:\Microsoft Visual 
Studio\2017\Community\VC\Tools\MSVC\14.11.25503\include\cliext\vector(1091): 
note: see reference to class template instantiation 
'cliext::impl::vector_base<_Value_t,false>' being compiled 
1>  with 
1>  [ 
1>   _Value_t=FrameCalculator::Color 
1>  ]` 

1>E:\Microsoft Visual 
Studio\2017\Community\VC\Tools\MSVC\14.11.25503\include\cliext\vector(615): 
error C3671: 'cliext::impl::vector_impl<_Value_t,false>::SyncRoot::get': 
function does not override 'System::Collections::ICollection::SyncRoot::get' 
1>  with 
1>  [ 
1>   _Value_t=FrameCalculator::Color 
1>  ]` 

有这些错误中的每一个大约有5个。我究竟做错了什么?我如何获得不慢的二维数组,可以在全局访问。我不需要两个数组都是动态的(我宁愿不要)。我知道内部数组将有3个元素,但在编译时我不会知道外部数组的大小。我如何实现这一目标?

+0

cliext类相当*比框架集合类慢得多。像列表一样。所以简单的解决方案,停止使用它。 –

+0

@HansPassant我没有意识到这一点。你建议我用什么?我想我会尝试使用不同类的非托管类型。你有什么其他的建议? – Byte11

+1

这取决于“列表太慢”,没有任何证据表明它太慢。将代码加快20%,使其快五倍,这两者之间存在巨大差异。只有一个体面的原因,为什么这样的重要细节缺失,你不知道它是否真的太慢,你只是假设它可能是。这并不慢。因此,先让它工作,总是比无法工作的代码好得多,然后找出它是否符合要求,那么您可能仍然有一个问题,其答案可能对您有用。 –

回答

0

您不能创建.Net类对象的向量。你需要一个句柄类型的向量。

test = gcnew cliext::vector<Color^>(5); 

而且您的类对象的类型必须是引用类的

ref class Color 

分配与总是创建一个新的对象来完成

test[0] = gcnew Color(255,255,255); 

您还可以使用完全非托管类型,但比您不得不在C++/CLI代码中使用指向这些数据的指针。

托管类型不能拥有非托管类型。他们可能拥有一个指向非托管类型的指针。

因此,您可能会将所有托管数据都归入一个非托管类,并且可以从托管代码访问此数据。

+0

颜色不是参考类型,如果速度很重要,颜色不应该是这样,所以这不会有太大的帮助。 –

+0

扩展我的答案 – xMRi

+0

我想我会尝试使用非托管类的想法,但是,我尝试在非托管类中使用std :: vector,并且它抛出了与上面相同的错误。也许是因为我将该向量返回给一个托管类,但即使当我删除托管类中的其他类的所有用法时,它也会抛出相同的错误。因此,我的印象是,公共裁判班和班级在矢量方面是相同的。我是否需要关闭该文件的/ clr,还是需要做其他事情? – Byte11