M::message
является зависимым именем, поскольку M
является аргументом шаблона. Компилятор не может знать, что зависимое имя само является шаблоном, поэтому вам нужно указать это явно:
M::template message<int>();
В противном случае компилятор анализирует код, как если бы M::message
было значением, что придает следующим угловым скобкам другое значение (т. Е. Они анализируются как операторы меньшего и большего размера, а не как разделители списка шаблонов). Компилятор не может восстановиться после такого неправильного разбора.