1

在下面的示例中,我有一个Foo具有泛型Tfoo类型字段的对象T

是可继承的Foo,并且有一个名为test的过程,它应该创建并返回一个T由子类定义的类型序列。

test在我的代码的最新版本中, proc的第一行有一个错误:

无法实例化:'T'


如果我摆脱S类型并将其替换为FooP,则错误消失,但随后出现错误discard b.test()

类型不匹配:得到(BarP)


这是代码:

type
    Foo[T] = object {.inheritable.}
        foo:T
    FooP[T] = ref Foo[T]

proc test[S, T](self: S): seq[T] =
    var f: T = self.foo
    var s: seq[T] = @[f]
    s   


type
    Bar = object of Foo[int]
    BarP = ref Bar 

var b: BarP = new(Bar)

discard x.test()

我确定我只是把这一切搞砸了。有人能告诉我在这种情况下如何成功返回子类定义test()的类型序列吗?T

4

1 回答 1

1

泛型的继承不起作用是一个已知的错误:https ://github.com/nim-lang/Nim/issues/88

您可以通过根本不指定类型来解决此问题,如此处的 test3 所示:

type
  Foo[T] = object {.inheritable.}
    foo: T
  FooP[T] = ref Foo[T]

# Only works for Foo[T]
proc test[T](self: Foo[T]): seq[T] =
  @[self.foo]

# Only works for ref Foo[T]
proc test2[T](self: FooP[T]): seq[T] =
  @[self.foo]

# Workaround:
proc test3(self): auto =
  @[self.foo]

type
  Bar = object of Foo[int]
  BarP = ref Bar

var a = new Foo[int]
var b: BarP = new(Bar)
var c: Bar

echo a.test3()
echo b.test3()
echo c.test3()
于 2015-01-24T12:51:13.927 回答