sclite(SCTK),C ++模板参数,Filter :: Filter *无效。 Cygwin的

时间:2018-05-08 23:51:25

标签: c++ c templates makefile header-files

问题

我目前正在尝试安装NIST' sclite,它是SCTK 2.4.0(githubnewer version)的一部分。我正在Cygwin的{​​{1}}上尝试安装。安装使用bash完成。

我能够通过进行64位编译来解决make的问题,如README末尾所述,并在我的another中详细说明SO帖子。

现在,我再次关注installation instructions并在输入file [format] not recognized

后收到以下错误
make all

有谁知道我可以做些什么来完成安装?

注意:当回答此问题时,安装在Cygwin上实际上并未完成。有些事情需要beforeafter,我会根据自己的进展以及下一步的问题向我发帖。

我的尝试

我在C ++文档中找不到关于In file included from main.cpp:20:0: recording.h:122:36: error: template argument 2 is invalid map<string, Filter::Filter*> filters; ^ recording.h:122:36: error: template argument 4 is invalid make[3]: *** [makefile:59: main.o] Error 1 make[3]: Leaving directory '/cygdrive/c/Me/programs/nist/sctk/src/asclite/core' make[2]: *** [makefile:12: all] Error 2 make[2]: Leaving directory '/cygdrive/c/Me/programs/nist/sctk/src/asclite' make[1]: *** [makefile:12: all] Error 2 make[1]: Leaving directory '/cygdrive/c/Me/programs/nist/sctk/src' make: *** [makefile:20: all] Error 2 的任何内容,并且通过克隆目录(Filter)中的文件进行搜索,部分提供了:

$ find . -type f \( -name "*.h" -o -name "*.c" -o -name "*.cpp" \) -print0 | xargs -I'{}' -0 grep -Hn "Filter" {}

据我所知,这意味着命名空间中有一个构造函数./src/asclite/core/checker.h:26:class Checker : public Filter ./src/asclite/core/filter.cpp:19: * Abstract interface to a Filter. ./src/asclite/core/filter.cpp:25:Filter::Filter() ./src/asclite/core/filter.cpp:30:Filter::~Filter() ./src/asclite/core/filter.h:26: * Abstract interface to a Filter. ./src/asclite/core/filter.h:28:class Filter ./src/asclite/core/filter.h:32: Filter(); ./src/asclite/core/filter.h:34: virtual ~Filter(); ... Filter

这是&#34;代码部分&#34; Filter

filter.cpp

这是$ cat src/asclite/core/filter.cpp | tail -16 /** * Abstract interface to a Filter. */ #include "filter.h" // class's header file // class constructor Filter::Filter() { } // class destructor Filter::~Filter() { }

的代码部分
filter.h

系统详细信息

$ cat src/asclite/core/filter.h | tail -27

#ifndef FILTER_H
#define FILTER_H

#include "stdinc.h"
#include "speech.h"
#include "speechset.h"

/**
 * Abstract interface to a Filter.
 */
class Filter
{
        public:
                // class constructor
                Filter();
                // class destructor
                virtual ~Filter();

                virtual bool isProcessAllSpeechSet() = 0;
                virtual unsigned long int ProcessSingleSpeech(Speech* speech) = 0;
                virtual unsigned long int ProcessSpeechSet(SpeechSet* ref, map<string, SpeechSet*> &hyp) = 0;

                virtual void LoadFile(const string& filename) = 0;
};

#endif // FILTER_H

1 个答案:

答案 0 :(得分:0)

我的答案

(另请查看我在问题下的评论,描述kaldi解决方案。)

注意:此问题解决后出现了另一个问题。请参阅本答案的底部以获得帮助。

我一直在努力解决这个问题,我发现答案最终正在改变我所要展示的问题(以及其他一些问题)。提醒一下,有问题的行来自文件src/asclite/core/recording.h

recording.h:122:28: error: template argument 2 is invalid
         map<string, Filter::Filter*> filters;

我把它改成了

map<string, ::Filter*> filters;

我也在Filter::Filter*第157和164行做了同样的更改(::Filter*src/asclite/core/recording.cpp),结果如下:

157: map<string, ::Filter*>::iterator fi, fe;

164: ::Filter* ptr_elt = fi->second;

在寻找答案和解释时,我还发现another page有解决方案,但没有解释。

下面的解释中有一个“让我澄清”的说明,阐述了这只是安装的部分解决方案。

研究和(希望)解释

我首先注意到有问题的行之前和之后的声明没有命名空间和双冒号,而我们的行有Filter::Filter*,如下所示:

$ cat src / asclite / core / recording.h |头-n 130 |尾巴-24         地图对齐器;

        /**
         * contain all the available Scorer
         */
        map<string, Scorer*> scorer;

        /**
         * contain all the available Segmentors
         */
        map<string, Segmentor*> segmentors;

        /**
                 * contain all the available Filters
         */
        map<string, Filter::Filter*> filters;

                /**
                 * Database for the optimization speaker alignment
                 */
                SpeakerMatch* m_pSpeakerMatch;

                /** the logger */
        static Logger* logger;

我首先尝试删除Filter命名空间和两个冒号(::)。我找到了一些网站(123,...),似乎在头文件中没有名称空间和双冒号的示例。它们只在实现文件中。我删除了Filter::(来自相关行和recording.cpp中的其他行),但这给了我

In file included from main.cpp:20:0:
recording.h:122:28: error: template argument 2 is invalid
         map<string, Filter*> filters;
                            ^
recording.h:122:28: error: template argument 4 is invalid

在研究双引号运算符(例如here)之后,在其他解决方案的帮助下,我将所有Filter::Filter*更改为::Filter

它编译了一些警告,但安装过程的其余部分工作让我澄清 make configmake all部分有效。 make test部分中存在错误,此处另有问题详述(待询问)。但是,运行make install会创建我需要的可执行文件。

有关前置双叉的信息,我从another SO post得到了一些帮助。在构造函数之前,两个冒号“卡在”上让我们知道它在全局范围内,即在recording.h / .cpp之外。这是必要的,因为在recording.h/.cpp中,创建了Filter对象的另一个Recording方法。 (在我写作的时候,情况越来越清晰。)

$ cat src/asclite/core/recording.cpp | head -n 290 | tail -5
/**
 * Filter the references and hypothesis with the availables filters.
 */
void Recording::Filter(const vector<string> & _filters)
{

$ cat src/asclite/core/recording.h | head -n 75 | tail -4
        /**
         * Filter the references and hypothesis with the availables filters.
         */
        void Filter(const vector<string> & _filters);

我认为我们没有命名空间(即Filter之前没有::)的原因被解释为here on SO。在这篇文章中,给出了.cpp(实现)文件中构造函数的代码,并给出了解释:

Mems::Mems() //you don't actually need to use the class keyword in your .cpp file; 
just the class name, the double colon, and the method name is enough to mark this 
as a class method

据我了解,将Filter::Filter放入Recording对象的代码中会建议Filter::FilterRecording对象的类方法,但这不是'这是有意义的,因为冒号之前的第一个Filter显然将其标记为Filter对象的类方法。

如果此解释错误或不清楚,请随时修复。

此解决方案解决了问题中的问题,但在检查安装成功之前有more to do