Как называется этот конфликт синтаксического анализа? - PullRequest
0 голосов
/ 05 декабря 2018

У меня проблема с компиляцией этого минимального примера с g ++ 7.3

template<typename T>
struct conflict
{
};

template<typename T>
struct s
{
    int conflict;
};

template<typename T>
bool go()
{
    s<T>* sp;
    return sp->conflict < 0;
}

Фактическое сообщение об ошибке меньше, чем показ:

|| test.cpp: In function ‘bool go()’:
test.cpp|16 col 24| error: type/value mismatch at argument 1 in template parameter list for ‘template<class T> struct conflict’
||   return sp->conflict < 0;
||                         ^
test.cpp|16 col 24| note:   expected a type, got ‘0’

На самом деле компилятор пытается создать экземпляршаблон conflict вместо сравнения поля conflict.

Есть ли у этой ошибки имя?

Кроме того, я исправил это, поменяв сравнение для использования >.Есть ли лучший способ?

1 Ответ

0 голосов
/ 05 декабря 2018

Как указал TC , это тема Активный выпуск CWG 1835 , в котором говорится:

Согласно 6.4.5 [basic.lookup.classref] параграф 1,

В выражении доступа к члену класса (8.2.5 [expr.ref]), если.или -> за маркером сразу же следует идентификатор, за которым следует <, идентификатор необходимо найти, чтобы определить, является ли <начало списка аргументов шаблона (17.2 [temp.names]) или оператор меньше чем.Идентификатор сначала ищется в классе выражения объекта.Если идентификатор не найден, он ищется в контексте всего выражения postfix и должен называть шаблон класса.</p>

Учитывая

   template<typename T> T end(T);
   template<typename T>
   bool Foo(T it) {
     return it->end < it->end;
   }

, поскольку он является зависимым и, следовательно, конец не может быть найден в классе выражения объекта, он ищется в контексте выражения postfix-выражения,Этот поиск находит шаблон функции, делая выражение неправильно сформированным.

Одной из возможностей может быть ограничение поиска классом выражения объекта, когда выражение объекта является зависимым.

Исправление - использовать ():

return (sp->conflict) < 0;

увидеть его вживую на Годболте

...