Nim泛型模板生成类型报错咨询:求简洁可行的实现方案
解决Nim模板生成类型的报错问题
嘿,这个其实是Nim模板使用里的一个常见小细节问题——你当前的写法之所以报错,是因为模板默认是生成表达式的,但在var a: ...这种需要类型的位置,Nim期待的是一个类型语法节点,而不是编译时求值后的类型对象。
错误原因拆解
你写的模板:
template p[T] = T
它的作用是把p[int]()展开成int这个类型值,但在类型声明的位置,Nim会认为你是在写一个表达式(而不是类型),所以抛出错误:expression 'T' is of type 'type int' and has to be discarded——意思是“你这个类型值得被丢弃,因为这里不该放表达式”。非泛型版本的问题也是一样的道理。
简洁的解决方案
只需要给模板明确指定返回类型为typedesc,告诉编译器:“我这个模板返回的是一个类型描述符,专门用来放在需要类型的位置”。
1. 泛型模板版本
template p[T]: typedesc = T var a: p[int] # 注意这里不需要加括号!
这里p[int]会直接在编译时展开成int,完全符合类型声明的要求,不会再报错。
2. 接受typedesc参数的版本
template p(t: typedesc): typedesc = t var a: p(int)
同样,指定返回类型为typedesc后,p(int)会被展开成int,完美适配类型声明场景。
额外小提醒
之前你加的括号p[int]()是多余的,因为模板不是函数,不需要调用执行——它是编译时的语法替换,直接写p[int]就会替换成对应的类型了。
内容的提问来源于stack exchange,提问作者v.oddou
相关产品推荐
相关产品推荐

