Почему эта маленькая программа на C ++ не компилируется с использованием G ++? - PullRequest
12 голосов
/ 04 мая 2011

Следующий код не будет компилироваться с G ++ 4.5 или 4.6 (снимок). Он будет компилироваться с компилятором Digital Mars 8.42n.

template <int I>
struct Foo {
  template <int J>
  void bar(int x) {}
};

template <int I>
void test()
{
  Foo<I> a;
  a.bar<8>(9);
};

int main(int argc, char *argv[]) {
  test<0>();
  return 0;
}

Сообщение об ошибке:

bugbody.cpp: In function 'void test() [with int I = 0]':
bugbody.cpp:16:11:   instantiated from here
bugbody.cpp:11:3: error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator<'

Действительно ли программа C ++?

1 Ответ

31 голосов
/ 04 мая 2011

Поскольку bar в a.bar является зависимым именем , компилятор не знает, что это шаблон.Вы должны указать это, иначе компилятор интерпретирует последующие <…> как бинарные операторы сравнения:

a.template bar<8>(9);

Компилятор ведет себя правильно.

Причина такого поведения заключается в специализации.Представьте, что вы специализировали класс Foo для некоторого значения:

template <>
struct Foo<0> {
    int bar;
};

Теперь ваш исходный код будет компилироваться, но это будет означать что-то совершенно другое.На первом этапе синтаксического анализа компилятор еще не знает, какую специализацию Foo вы используете здесь, поэтому он должен устранить неоднозначность между двумя возможными вариантами использования a.bar;отсюда ключевое слово template, показывающее компилятору, что последующие <…> являются аргументами шаблона.

...