Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
纯虚拟c++;用rice/ruby包装的类在运行时引发TypeError(“不是类(模块)” 我正在包装一个叫C++库的过程 作为使用rice ruby包装器的ruby扩展_C++_Ruby_Pure Virtual_Ruby Rice - Fatal编程技术网

纯虚拟c++;用rice/ruby包装的类在运行时引发TypeError(“不是类(模块)” 我正在包装一个叫C++库的过程 作为使用rice ruby包装器的ruby扩展

纯虚拟c++;用rice/ruby包装的类在运行时引发TypeError(“不是类(模块)” 我正在包装一个叫C++库的过程 作为使用rice ruby包装器的ruby扩展,c++,ruby,pure-virtual,ruby-rice,C++,Ruby,Pure Virtual,Ruby Rice,在这个库中,有两个纯虚拟类,称为 essentia::standard::Algorithm和essentia::streaming::Algorithm。我按照说明创建了以下代码: 算法.hpp 一切都可以很好地编译(使用clang++-std=c++1y),但是,当我尝试运行生成的代码时,我得到: eeepc-1215B:.../essentia-ruby$ ruby -I./lib/essentia -e "require 'essentia_ruby_wrap'" /

在这个库中,有两个纯虚拟类,称为
essentia::standard::Algorithm
essentia::streaming::Algorithm
。我按照说明创建了以下代码:

算法.hpp 一切都可以很好地编译(使用
clang++-std=c++1y
),但是,当我尝试运行生成的代码时,我得到:

eeepc-1215B:.../essentia-ruby$ ruby -I./lib/essentia -e "require 'essentia_ruby_wrap'"
/home/nicb/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': Essentia::Streaming::Algorithm is not a class (Module) (TypeError)
    from /home/nicb/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from -e:1:in `<main>'
eeepc-1215B:…/essentia ruby$ruby-I./lib/essentia-e“需要‘essentia_ruby_wrap’”
/home/nicb/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/core\u ext/kernel\u require.rb:55:in'require':Essentia::Streaming::Algorithm不是类(模块)(TypeError)
from/home/nicb/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/core\u ext/kernel\u require.rb:55:in'require'
from-e:1:in`'
我找不到代码中的错误,我到处都在寻找答案,但毫无结果


另外,我的完整代码是

,这更像是一个注释,但为了格式起见,我把它作为一个答案。请让我知道这是否是一个错误的假设,以便我可以删除它

我相信原因是ruby扩展希望名称空间大写,而不是。请尝试:


等等。这应该会有帮助。注意:我曾尝试克隆repo并自己做,但
/wav
命令(如
自述文件
中指定的)失败。

这更像是一个注释,但为了格式化,我将其作为答案。请让我知道这是否是一个错误的假设,以便我可以删除它

我相信原因是ruby扩展希望名称空间大写,而不是。请尝试:

等等。这应该会有帮助。注意:我已尝试克隆repo并自己执行,但
/wav
命令(如
自述文件中指定的)失败。

已解决 正如我所想,这真是(我)的一件蠢事

通过查看产生错误的
ruby
代码,我偶然发现了解决方案:

c类(第641-660行) 上面写的文件说:

throws a TypeError if the constant name is already taken but
the constant is not a Class.
我想到,在尝试模仿ruby的
essentia
目录树(从而为每个目录构建一个模块)时,我已经创建了一个名为
essentia::Streaming::Algorithm
的模块,因此不可能有同名的类

我可以说,我被一些不同的问题误导了,但我会避免:我太愚蠢了,忘记了几天前我已经编写了那个模块——没有借口。经验教训是,
ruby
将不允许使用相同名称的
模块和
类,而只允许先到的人。这是完全合乎逻辑的,就是这样。

正如我所想,这真是(我)的一件蠢事

通过查看产生错误的
ruby
代码,我偶然发现了解决方案:

c类(第641-660行) 上面写的文件说:

throws a TypeError if the constant name is already taken but
the constant is not a Class.
我想到,在尝试模仿ruby的
essentia
目录树(从而为每个目录构建一个模块)时,我已经创建了一个名为
essentia::Streaming::Algorithm
的模块,因此不可能有同名的类


我可以说,我被一些不同的问题误导了,但我会避免:我太愚蠢了,忘记了几天前我已经编写了那个模块——没有借口。经验教训是,
ruby
将不允许使用相同名称的
模块和
类,而只允许先到的人。这完全符合逻辑,就是这样。

谢谢@mudasobwa的快速回复。我将尝试采纳你的建议,并为它做一个测试案例。但是,在这种特殊情况下,情况是:1)原始C++代码具有非大写的名称空间(<代码> Enthutial<代码>,<代码> EsTun::流< /COD>等)2)作为<代码>的C++ <代码> >包装有大写的名称空间(<代码> Rice < /代码>,<代码> Rice::EsStudio,<代码> Rice::EsSunTun::流> <代码>)为了模仿
ruby
惯例3),这与创建的
ruby
模块无关,这些模块是单独创建的,并遵循
ruby
惯例(即
Essentia::Standard
Essentia::Streaming
等)。感谢@mudasobwa的快速回复。我将尝试采纳你的建议,并为它做一个测试案例。但是,在这种特殊情况下,情况是:1)原始C++代码具有非大写的名称空间(<代码> Enthutial<代码>,<代码> EsTun::流< /COD>等)2)作为<代码>的C++ <代码> >包装有大写的名称空间(<代码> Rice < /代码>,<代码> Rice::EsStudio,<代码> Rice::EsSunTun::流> <代码>)为了模仿
ruby
约定3),这与创建的
ruby
模块无关,这些模块是单独创建的,并遵循
ruby
约定(即
Essentia::Standard
Essentia::Streaming
等)我还应该补充一点,误导性的问题是
模块
X.is_a?(模块)=>true
如果
X
是一个类),反之亦然。我还应该补充一点,误导性的问题是
模块
X.is_a?(模块)=>true
如果
X
是一个类),但反之亦然。
eeepc-1215B:.../essentia-ruby$ ruby -I./lib/essentia -e "require 'essentia_ruby_wrap'"
/home/nicb/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': Essentia::Streaming::Algorithm is not a class (Module) (TypeError)
    from /home/nicb/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from -e:1:in `<main>'
namespace Essentia = essentia;
namespace Essentia::Streaming = essentia::streaming;
642 VALUE
643 rb_define_class(const char *name, VALUE super)
644 {
645     VALUE klass;
646     ID id;
647 
648     id = rb_intern(name);
649     if (rb_const_defined(rb_cObject, id)) {
650     klass = rb_const_get(rb_cObject, id);
651     if (!RB_TYPE_P(klass, T_CLASS)) {
652         rb_raise(rb_eTypeError, "%s is not a class (%"PRIsVALUE")",
653              name, rb_obj_class(klass));
654     }
655     if (rb_class_real(RCLASS_SUPER(klass)) != super) {
656         rb_raise(rb_eTypeError, "superclass mismatch for class %s", name);
657     }
658     return klass;
659     }
throws a TypeError if the constant name is already taken but
the constant is not a Class.