Почему я не могу вызвать шаблонный метод класса шаблона, который является производным от - PullRequest
6 голосов
/ 14 марта 2012
struct Messages
{
      template <typename V>
      static const char* message() {return "test mesage";}
};

template <int Min, class M=Messages>
struct Test: public M
{
    Test() 
    {
        M::message<int>(); //error: expected primary-expression before 'int'
    }
};

int main()
{
     Test<5, Messages> t;
}

Я подозреваю, что это связано с некоторой взаимозависимостью, как, например, код Test зависит от базового класса M, метод которого специализирован внутри Test. Это правильно?

1 Ответ

7 голосов
/ 14 марта 2012

M::message является зависимым именем, поскольку M является аргументом шаблона. Компилятор не может знать, что зависимое имя само является шаблоном, поэтому вам нужно указать это явно:

M::template message<int>();

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...