Мы можем разбить как то, как диагностировать это, так и как и почему исправление работает.
<source>:35:19: error: reference to non-static member function must be called
ОК, поэтому clang думает, что что-то называет нестатичную c функцию-член, и что выражение, в котором вы его используете, является , а не вызовом функции:
list_.front().Set<Flags::First>(true);
~~~~~~~~~~~~~~^~~
Это довольно ясно говорит нам о том, что он распознает Set
как функцию, не являющуюся членом c , но считает, что Set<Flags::First>(true)
является , а не вызовом функции.
Очевидно, что это именно правильный синтаксис для вызова шаблона функции, поэтому проблема заключается в том, что clang не рассматривает Set
как шаблон функции.
На этом этапе обязательно прочитайте вопрос, указанный в комментариях выше, и принятый ответ .
...
Хорошо, теперь вы прочитали это, очевидно, что Set
является зависимым именем функции, и мы можем решить проблему, добавив template
следующим образом:
list_.front().template Set<Flags::First>(true);
но это все еще оставляет открытым вопрос почему имя зависимый. Я имею в виду, читая код, мы знаем, что list_.front()
должен иметь тип Header&
, верно?
Итак, давайте попробуем написать это явно:
Header &front = list_.front();
front.Set<Flags::First>(true);
и мы увидим (все еще с лязгом 8 или 9), что теперь это работает без дополнительных template
. Если вы напишите auto &front
, проблема вернется.
FWIW, это отображается в clang 8 и 9, но исчезает в clang 10 и, кажется, никогда не возникает в G CC. Таким образом, это может быть ошибка, но, по крайней мере, теперь вы знаете, как ее диагностировать и как ее обойти.