Мой ответ
(Также посмотрите мой комментарий под вопросом, описывающий решение 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 * нужно сделать до того, как проверки для установки пройдены успешно.