Синтаксис для вызова шаблонного метода - PullRequest
6 голосов
/ 22 октября 2010

Мне интересно, каков правильный синтаксис для вызова метода шаблона, такого как:

struct print_ch {
    print_ch(char const& ch) : m_ch(ch) { }
    ~print_ch() { }
    template<typename T>
    void operator()() {
        std::cout << static_cast<T>(m_ch) << std::endl;
    }
    private:
    char m_ch;
};

Я придумал что-то вроде этого:

print_ch printer('c');
printer.operator()<int>();

И, похоже, работаетGCC 4.5), но когда я использую его внутри другого шаблонного метода, например:

struct printer {

    typedef int print_type;

    template<typename T_functor>
    static void print(T_functor& fnct) {
        fnct.operator()<print_type>();
    }

};

Компиляция завершается с error: expected primary-expression before '>' token.Есть идеи, чтобы сделать это правильно?Заранее спасибо.

Ответы [ 2 ]

8 голосов
/ 22 октября 2010

Вы должны явно указать компилятору, что operator() шаблонного fnct сам по себе является шаблоном:

fnct.template operator()<print_type>();

Если вы не укажете это с ключевым словом template, компиляторбудет предполагать, что operator() это просто обычный метод, а не шаблон.

2 голосов
/ 22 октября 2010

Поскольку T_functor сам по себе является шаблоном, компилятор (или синтаксический анализатор) предполагает, что он ничего не знает о его членах, поэтому вы должны явно сообщить ему, что вызываете метод шаблона, используя:

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