首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从导入中返回类型不匹配错误的proc调用,但当包含

从导入中返回类型不匹配错误的proc调用,但当包含
EN

Stack Overflow用户
提问于 2018-02-06 07:04:51
回答 1查看 237关注 0票数 2

我有一个作为构造函数的过程,用来构造一个自定义的对象类型,一个“场景”对象。当我从另一个模块导入过程时,我会得到以下编译器错误:

main.nim(44,43)错误:类型不匹配: got (名称: string,seqSceneObject,slc: SceneLifeCycle),但期望其中之一: proc newScene(名称: string;sceneObjects: seqSceneObject;slc: SceneLifeCycle):场景

但是,当我将同一个过程的定义移到调用它的同一个文件上时,它就完美地工作了。我在导入方面做错了什么,还是Nim的自定义对象类型的导入和导出行为不一致?此外,简单地包括文件修复了这个问题。

代码语言:javascript
复制
# src/game_types.nim - where I am storing type definitions

SceneLifeCycleProc* = proc()

SceneObject* = ref object
  tags*: seq[string]
  active*: bool
  visible*: bool
  x, y: float

Scene* = ref object
  name*: string
    sceneObjects*: seq[SceneObject]
    onRegister*: SceneLifeCycleProc
    onEnter*: SceneLifeCycleProc
    onUpdate*: SceneLifeCycleProc
    onRender*: SceneLifeCycleProc
    onExit*: SceneLifeCycleProc
    onDestroy*: SceneLifeCycleProc


# src/scene_managment.nim - file exporting newScene from

include game_types

proc newScene* ( name: string, sceneObjects: seq[SceneObject], slc: 
  SceneLifeCycle): Scene =
  new result
  result.name = name
  result.sceneObjects = sceneObjects
  result.onRegister = slc[0]
  result.onEnter = slc[1]
  result.onUpdate = slc[2]
  result.onRender = slc[3]
  result.onExit = slc[4]
  result.onDestroy = slc[5]

以及main.nim,它似乎无法通过导入newScene来工作:

代码语言:javascript
复制
# src/main.nim

include game_types
import scene_management

# throws type mismatch error
let titleScene = newScene(
  "title",
  newSeq[SceneObject](4),
  [registerTitleScene.SceneLifeCycleProc,
  enterTitleScene.SceneLifeCycleProc,
  updateTitleScene.SceneLifeCycleProc,
  renderTitleScene.SceneLifeCycleProc,
  exitTitleScene.SceneLifeCycleProc,
  destroyTitleScene.SceneLifeCycleProc]
 )

但是,对于在newScene中定义的main.nim过程,它工作得很好:

代码语言:javascript
复制
# src/main.nim - this works, and I don't know why importing doesn't:
include game_types

# defined in the same file
proc newScene ( name: string, sceneObjects: seq[SceneObject], slc: 
  SceneLifeCycle): Scene =
  new result
  result.name = name
  result.sceneObjects = sceneObjects
  result.onRegister = slc[0]
  result.onEnter = slc[1]
  result.onUpdate = slc[2]
  result.onRender = slc[3]
  result.onExit = slc[4]
  result.onDestroy = slc[5]


# no compiler error
let titleScene = newScene(
  "title",
  newSeq[SceneObject](4),
  [registerTitleScene.SceneLifeCycleProc,
  enterTitleScene.SceneLifeCycleProc,
  updateTitleScene.SceneLifeCycleProc,
  renderTitleScene.SceneLifeCycleProc,
  exitTitleScene.SceneLifeCycleProc,
  destroyTitleScene.SceneLifeCycleProc]
)

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-06 07:46:34

简单回答:避免使用include

很长的答案:问题在于,您将game_types包含到不同的模块中,因此,根据模块的不同,它们最终在不同的名称空间中声明,因此是不同的类型。例如,您的第一个示例调用newScenemain.SceneLyfeCycle传递给它,但是newScene接受scene_managment.SceneLyfeCycle。第二个示例工作正常,因为newScene接受main.SceneLyfeCycle,而您正是将它传递给它。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48637253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档