ошибка при инстанцировании шаблона
|
|
Суббота, 12 Сентября 2020 г. 17:35
+ в цитатник
Qraizer: Даже я слегка подвис. Нечасто встречающаяся ситуация.
Дело в том, что внутри b<> имя a является зависимым, поэтому что такое a::AA, компилятору неведомо вплоть до точки инстанцирования. Только там, подставив конкретное param, он будет способен разобраться, что a::AA – это тоже шаблон, а значит <2> является его инстацированием с аргументом 2. Однако ещё на первой фазе, при компиляции шаблона b<>, что значительно раньше его инстанцирования, он должен знать о том, что такое a::AA. Т.к. у него нет никакой информации на этот счёт, он вынужден предположить, что это просто некое поле, и <2> является применением к нему арифметических операций < и >. Да, оно грамматически некорректно, однако по правилам Стандарта он не чекает корректность грамматики до момента инстанцирования, тем не менее неверный вывод о сути a::AA он уже сделал, и в точке инстанцирования b<>::BB2 ты видишь последствия этого. Замечу, что c b<>::BB1 такой оказии не происходит, т.к. аргументы для a<> и a<>::AA<> указаны явно и не являются зависимыми от param, так что он способен — и должен — правильно определить грамматический смысл a<3>::AA<2> ещё на первой фазе.
Исправить сие несложно, нужно лишь сообщить ему о сути a<>::AA ещё на первой фазе:
static int constexpr BB2 = a::template AA<2>;
Применение точно такое же, как и typename в подобных случаях, когда зависимое имя является типом, только тут template сообщает, что оно является шаблоном.
https://forum.sources.ru/index.php?showtopic=419647&view=findpost&p=3838783
Метки:
C/C++:
Общие вопросы
-
Запись понравилась
-
0
Процитировали
-
0
Сохранили
-