Clang не анализирует шаблон с частичной специализацией: template <class T, class U = TYPE_A <T>> class TYPE_B; - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть пример кода с шаблоном с частичной специализацией шаблона. И где лязгает при разборе, возвращает результат недопустимого объявления.

template < class T> class TYPE_A
{
};

template < class T, class U> class TYPE_B
{
};

template < class T, class U = TYPE_A<T> > class TYPE_B;

typedef TYPE_B<double> B_Test;

У меня есть результат ast dump:

TypedefDecl 0x2024d557af0 <D:\Projects\Reps\NET_Desktop\Rel\Kernel\include\OdArrayPreDef.h:60:1, col:27> col:27 invalid somethingTest 'int'
`-BuiltinType 0x2024caff080 'int'

Почему разговор clang (последняя строка в дампе) недействителен?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Я пытался разобрать только эти конструкции без каких-либо конструкций #include.

И синтаксический анализ typedef правильный.

Я обнаружил, что проблема в другом.

Препроцессор попытался найти #include "file.h" - не смог найти, поэтому сгенерировал "фатальную ошибку: такого файла нет", и препроцессор был прерван. Поэтому следующая предварительная обработка шаблонов и прочего была остановлена. И поэтому я получил недействительную декларацию.

Я нашел исправление: -Необходимо, чтобы препроцессор не завершал работу через «фатальную ошибку: такого файла нет».

Я изменил код (я добавил конструкцию в пользовательский класс ParseDeclarationAction, который унаследован от ASTFrontendAction):

CI.getPreprocessor () SetSuppressIncludeNotFoundError (истина);.

В результате у меня есть класс:

класс ParseDeclarationAction: общедоступный ASTFrontendAction { общественности: virtual unique_ptr CreateASTConsumer (CompilerInstance & CI, StringRef InFile) { . CI.getPreprocessor () SetSuppressIncludeNotFoundError (истина); return unique_ptr (новый ParseDeclarationConsumer (& CI.getASTContext ())); } };

Я думаю, что проблема может помочь другим пользователям Clang.

Эта задача решена.

С наилучшими пожеланиями, Иван.

0 голосов
/ 20 апреля 2019

Существует разница между частичной специализацией и аргументами по умолчанию.Частичная специализация создает другую версию кода для разных параметров шаблона, где аргументы по умолчанию предоставляют параметры шаблона, когда они не специализированы.

Я полагаю, что вы все еще можете смешивать их и получать нужный код:

template < class T> class TYPE_A { };

template < class T, class U = TYPE_A<T> > class TYPE_B { };

template <class T> class TYPE_B<T, TYPE_A<T> > { };

typedef TYPE_B<double> B_Test;

Класс B_Test должен по-прежнему использовать специализацию, где вторым параметром является `TYPE_A

...