繁体   English   中英

无法在列表中将类型'uint'隐式转换为'T'(来自类模板)

[英]Cannot implicitly convert type 'uint' to 'T' (from class template) in List

我正在将代码从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> ,其中不存在这种转换。 此外,您尝试使用带有int而不是uint类型的count的构造函数设置List<T> 你需要做什么:

  1. 使用this.p = new List<T>()使用List<T>构造函数的this.p = new List<T>()
  2. 要么接受int ,或铸uintint
  3. 无论如何,在构造器中初始化p的声明时,我将使其未实例化。
  4. 使用构造函数链接

     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并在构造函数中处理转换,但是警告您可能会传递会溢出的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM