导入的函数缺少在另一个模块中定义的方法

Imported function lacks method defined in another module

我有一个描述框架的模块A。然后,几个实现框架的模块(这里只是B)。最后,我希望 C 使用任何实现。

但是,运行下面的例子:

module A
    abstract type Ab end

    f(::Ab) = "Not NotImplemented"
    export Ab, f
end

module B
    using Main.A
    struct Bb <: A.Ab end
    A.f(::Bb) = "B"
    export Bb, f
end

module C
    using Main.A
    struct Cc
        btype :: A.Ab
    end
    f(model::Cc) = f(model.btype)
    function g(model::Cc)
        @show f(model)
    end
    export Cc, g
end

using Main.A, Main.B, Main.C

ex0 = B.Bb()
ex1 = C.Cc(ex0)
g(ex1)

returns 一个错误

ERROR: LoadError: MethodError: no method matching f(::Main.B.Bb)
Closest candidates are:
  f(::Main.C.Cc) at C:\Users\tangi\.julia\dev\VariationalInequalitySolver\script.jl:2

而且我真的不想在模块 C 中导入 B 来保证通用性。

问题是:

f(model::Cc) = f(model.btype)

在您的 C 模块中,因为它在名称为 f.

的模块 C 中创建了一个 新函数

你需要写:

A.f(model::Cc) = f(model.btype)

它为模块 A.

中的函数 f 创建了一个新方法