我基本有以下代码。
//*** Field.h ***\\
public ref class Field
{
public:
String^ Name;
UInt16 Lenght;
Field(void);
}
//*** SNVT.h ***\\
public ref class SNVT
{
public:
String^ Name;
UInt16 Index;
List<Field^> FieldList;
SNVT(void);
}
//*** Viewer.h ***\\
public ref class Viewer
{
public:
List<SNVT^> SNVT_List;
Viewer(void);
SomeViewerFunction();
}
//*** Viewer.cpp ***\\
void SomeViewerFunction()
{
SNVT^ currentSNVT = gcnew SNVT();
Field^ currentField = gcnew Field();
currentField->Name = "Field Name";
currentField->Leght = 10;
currentSNVT->Name = "SNVT Name";
currentSNVT->Index = 1;
currentSNVT->FieldList.Add(currentField);
SNVT_List.Add(currentSNVT);
Tools New_Tools;
New_Tools.SomeToolsFunction(SNVT_List);
}
//*** Tools.h ***\\
class Tools
{
public:
Tools(void);
SomeToolsFunction(List<SNVT^> Tools_SNVT_List);
}
//*** Tools.cpp ***\\
void SomeToolsFunction(List<SNVT^> Tools_SNVT_List)
{
/*
use Tools_SNVT_List here
*/
}
因此,我的想法是我将调用SomeViewerFunction,它将向SNVT_List添加数据。然后SomeViewerFunction将创建一个Tools实例,以调用SomeToolsFunction。 SomeToolsFunction使用变量SNVT_List。
但是我得到一个错误;类“ System :: Collections :: Generic :: List”没有合适的副本构造函数。
最后,我要做的就是在Viewer中创建一个SNVT类型的System :: Collections :: Generic :: List类型变量,然后将该变量发送到Tools。 关于如何实现此目标的任何想法吗?
请注意以下内容... 除工具类外,我所有的类都是参考类。类工具必须保留本机类。 我知道在C#中会更容易,但是其他人在C ++中启动了这个项目,所以我必须在c ++中继续;
// 2019-01-10 谢谢David Yaw 我将代码更改为以下代码,并且可以按预期工作。
//*** Field.h ***\\
public ref class Field
{
public:
String^ Name;
UInt16 Lenght;
Field(void);
}
//*** SNVT.h ***\\
public ref class SNVT
{
public:
String^ Name;
UInt16 Index;
List<Field^> FieldList;
SNVT(void);
}
//*** Viewer.h ***\\
public ref class Viewer
{
public:
List<SNVT^>^ SNVT_List; // I changed this line from List<SNVT^> SNVT_List;
Viewer(void);
SomeViewerFunction();
}
//*** Viewer.cpp ***\\
void SomeViewerFunction()
{
SNVT_List = gcnew List<SNVT^>(); // I added this line
SNVT^ currentSNVT = gcnew SNVT();
Field^ currentField = gcnew Field();
currentField->Name = "Field Name";
currentField->Leght = 10;
currentSNVT->Name = "SNVT Name";
currentSNVT->Index = 1;
currentSNVT->FieldList.Add(currentField);
SNVT_List->Add(currentSNVT); // I changed this line from SNVT_List.Add(currentSNVT);
Tools New_Tools;
New_Tools.SomeToolsFunction(SNVT_List);
}
//*** Tools.h ***\\
class Tools
{
public:
Tools(void);
SomeToolsFunction(List<SNVT^>^ Tools_SNVT_List); // I changed this line from SomeToolsFunction(List<SNVT^> Tools_SNVT_List);
}
//*** Tools.cpp ***\\
void SomeToolsFunction(List<SNVT^>^ Tools_SNVT_List) // I changed this line from void SomeToolsFunction(List<SNVT^> Tools_SNVT_List)
{
/*
use Tools_SNVT_List here
*/
}
答案 0 :(得分:1)
List<Whatever^> Foo
这种类型几乎是不正确的。无论是类成员,方法参数还是局部变量,都应将其切换为List<Whatever^>^ Foo
,并使用第二个^
。用gcnew List<Whatever^>()
初始化它。 (请注意:如果它是值类型的列表,例如int
,则^
中没有<>
。)
列表是引用类型(在C#中为class
,在C ++ / CLI中为ref class
)。因此,它应该始终是对托管堆上对象的引用,这就是^
的含义。
在没有^
的情况下,引用类型被放到堆栈中/直接在对象内分配,这在C ++ / CLI中是可能的,但在C#中是不可能的。因此,所有API都不期望使用该类型。这就是为什么出现“列表没有合适的复制构造函数”错误的原因,因为您尝试使用List<Whatever^>
,但是复制构造函数使用了List<Whatever^>^
。
此外,请注意,这不是 C ++。这就是C ++ / CLI,它具有C ++的所有复杂性,C#的所有复杂性以及其中一些自身的复杂性。