无法隐式转换类型';uint';到';T';(来自类模板)
本文关键字:uint 转换 类型 | 更新日期: 2023-09-27 18:27:26
我正在将代码从C++转换为C#,但在泛型变量问题的向量部分遇到了一些问题。我是C#的初学者。
C++代码:
Pvec(){}
Pvec(size_t n): p(n) {}
Pvec(size_t n, T v): p(n, v) {}
template<class T2>
Pvec(const vector<T2>& v) {
for (int i = 0; i < p.size(); ++i)
p[i] = v[i];
}
template<class T2>
Pvec(const Pvec<T2>& v) {
p.resize(v.size());
for (int i = 0; i < v.size(); ++i)
p[i] = v[i];
}
C#代码(由我转换,但面临许多错误):
public class Pvec <T>
{
private List<T> p = new List<T>();
public Pvec()
{
}
public Pvec(uint n)
{
this.p = n;
}
public Pvec(uint n, T v)
{
this.p = new List<T>(n, v);
}
//ORIGINAL LINE: template<class T2>
public Pvec<T2>(List<T2> v)
{
for (int i = 0; i < p.Count; ++i)
{
p[i] = v[i];
}
}
//ORIGINAL LINE: template<class T2>
public Pvec<T2>(Pvec<T2> v)
{
p.resize(v.size());
for (int i = 0; i < v.size(); ++i)
{
p[i] = v[i];
}
}
我在课堂上有两个以上的模板怎么样?
您的代码有几个问题。首先,您正在尝试将uint
分配给List<T>
,但不存在这样的转换。此外,您正在尝试使用一个构造函数设置List<T>
,该构造函数获取类型为int
而非uint
的计数。你需要做什么:
- 使用使用
List<T>
构造函数的this.p = new List<T>()
- 要么接受
int
,要么将uint
强制转换为int
- 我将不实例化
p
的声明,因为您无论如何都要在构造函数中初始化它 -
使用构造函数链接
public class Pvec<T> { private List<T> p; private const int DefaultVectorSize = 4; public Pvec() : this(DefaultVectorSize, default(T)) { } public Pvec(uint n) : this((int)n, default(T)) { } public Pvec(uint n, T v) { var capacity = (int)n; p = EqualityComparer<T>.Default.Equals(v, default(T)) ? new List<T>(capacity) { v } : new List<T>(capacity); } }
或者:
public class Pvec<T>
{
private List<T> p;
private const int DefaultVectorSize = 4;
public Pvec() : this(DefaultVectorSize, default(T))
{
}
public Pvec(int n) : this(n, default(T))
{
}
public Pvec(int n, T v)
{
p = EqualityComparer<T>.Default.Equals(v, default(T)) ?
new List<T>(n) { v } : new List<T>(n);
}
}
旁注-为参数提供有意义的名称。
这是错误的:
public Pvec(uint n)
{
this.p = n;
}
您正试图将uint
分配给列表。在C++代码中,uint
是vector
的大小。您需要在C#中对此进行镜像。你可以这样做:
public Pvec(int n)
{
p = new List<T>(n);
}
注意-我从uint
更改为int
,因为这是列表构造函数的类型。您可以将其保留为uint
,并在构造函数中处理转换,但同时警告您可能会传入溢出的值。