sclite (SCTK), аргумент шаблона C++, Filter::Filter*, недопустим. Cygwin
проблема
В настоящее время я пытаюсь установить NIST sclite
, который является частью SCTK 2.4.0 ( github или более новая версия). Я пытаюсь установить на Cygwin
в bash
, Установка выполняется с использованием make
,
Я смог преодолеть проблему с file [format] not recognized
выполнив 64-битную компиляцию, как описано в конце README и подробно описано в другой из моих публикаций SO.
Теперь я снова следую инструкциям по установке и получаю следующую ошибку после ввода make all
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
Кто-нибудь знает, что я могу сделать, чтобы завершить установку?
Примечание. После ответа на этот вопрос на Cygwin установка фактически не завершается. Есть вещи, которые нужно сделать до и после, которые я публикую на SO со своим прогрессом и с вопросами о том, куда идти дальше.
Мои попытки
Я не нашел ничего о Filter
в C++ документы и поиск по файлам в клонированном каталоге ($ 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
в пространстве имен, 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
Сведения о системе
$ uname -a
CYGWIN_NT-6.1 CAP-D-ENG-INT3 2.10.0(0.325/5/3) 2018-02-02 15:16 x86_64 Cygwin
$ bash --version
GNU bash, version 4.4.12(3)-release (x86_64-unknown-cygwin) ...
$ gcc --version
gcc (GCC) 6.4.0 ...
$ g++ --version
g++ (GCC) 6.4.0 ...
$ make --version
GNU Make 4.2.1
Built for x86_64-unknown-cygwin ...
$ systeminfo | sed -n 's/^OS\ *//p'
Name: Microsoft Windows 7 Enterprise
Version: 6.1.7601 Service Pack 1 Build 7601
Manufacturer: Microsoft Corporation
Configuration: Member Workstation
Build Type: Multiprocessor Free
1 ответ
Мой ответ
(Также посмотрите на мой комментарий под вопросом, описывающий 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*
в ::Filter*
) в src/asclite/core/recording.cpp
, строки 157 и 164, результаты следующие:
157: map<string, ::Filter*>::iterator fi, fe;
164: ::Filter* ptr_elt = fi->second;
В поисках ответа и объяснения я также нашел другую страницу, на которой есть решение, но нет объяснения.
В приведенном ниже объяснении есть примечание "Позвольте мне уточнить", которое объясняет тот факт, что это только частичное решение для установки.
Исследование и (Надеюсь) Объяснение
Сначала я заметил, что объявления до и после рассматриваемой строки не имеют пространства имен и двойного двоеточия, тогда как наша строка имеет Filter::Filter*
, как можно увидеть ниже:
$ cat src / asclite / core / recording.h | голова-н 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
пространство имен и два двоеточия (::
). Я нашел несколько сайтов ( 1, 2, 3,...), где, похоже, не было примеров пространств имен и двойных двоеточий в заголовочных файлах. Они были только в файлах реализации. Я удалил 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
Изучив оператор двойных кавычек (например, здесь) и с помощью другого решения, я изменил все Filter::Filter*
в ::Filter
,
Он скомпилирован с некоторыми предупреждениями, но остальная часть процесса установки работала. Позвольте мне уточнить make config
а также make all
запчасти работали. Были ошибки в make test
часть, подробно в другом вопросе здесь (чтобы спросить). Тем не менее, работает make install
создает исполняемые файлы, которые мне нужны.
Для получения информации о добавленном двойном двоеточии я получил некоторую помощь от другого SO сообщения. Два двоеточия "застряли" перед конструктором, дайте нам знать, что он находится в глобальной области видимости, то есть за пределами записи.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
перед ::
) объясняется здесь на 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::Filter
это метод класса для Recording
объект, но это не имеет смысла, потому что первый Filter
прежде чем двоеточия, очевидно, помечает его как метод класса для Filter
объект.
Если это объяснение неверное или неясное, не стесняйтесь его исправить.
Это решение устранило проблему, о которой шла речь в вопросе, но до того, как проверки на установку прошли успешно, нужно было сделать еще многое.