sclite (SCTK), аргумент шаблона C ++, Filter :: Filter *, недопустим. Cygwin - PullRequest
0 голосов
/ 09 мая 2018

Задача

В настоящее время я пытаюсь установить 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 Ответ

0 голосов
/ 09 мая 2018

Мой ответ

(Также посмотрите мой комментарий под вопросом, описывающий решение 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 |корректор карты tail -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 объект.

Если это объяснение неверное или неясное, не стесняйтесь его исправить.

Это решение устранило проблему в вопросе, но возникла *Еще 1098 * нужно сделать до того, как проверки для установки пройдены успешно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...