Компилятор c ++ обрабатывает синтаксис шаблона как оператор «<» - PullRequest
3 голосов
/ 30 ноября 2011

Я пытаюсь скомпилировать следующий код:

struct A {
    template<int N> static void a() {}
};

template<> void A::a<5>() {}

template<class T>
struct B {
    static void b() {
        T::a<5>();
    }
};

void test() {
    A::a<5>();
    B<A>::b();
}

и компилятор интерпретирует < в T::a<5> как оператор <, что приводит к ошибке:

invalid operands of types ‘<unresolved overloaded function type>’ and ‘int’ to binary ‘operator<’

Есть ли способ явно создать экземпляр T::a<5> без ошибок компилятора?Спасибо.

gcc версия 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC)

1 Ответ

6 голосов
/ 30 ноября 2011

Да, измените эту строку на:

T::template a<5>();

Компилятор не знает, является ли T::a функцией (из-за своей природы template). Упоминая template, вы сообщаете компилятору явно. Этот вопрос задают много раз, вот один из них .

...