Вызов шаблона статической функции в зависимой области - PullRequest
3 голосов
/ 26 марта 2012

Предположим, у меня есть шаблон статической функции template<int I> void ft() в шаблоне структуры template<bool B> S, и я хочу вызвать ft из другого шаблона функции template<bool B> void g(), передав параметр шаблона bool от g до S :

template<bool B>
struct S {
  static void f() {
  }
  template<int I>
  static void ft() {
  }
};

template<bool B>
void g() {
  S<B>::f();
  S<B>::ft<12>();
}

int main() {
  g<true>();
  return 0;
}

Компиляция этого в GCC 4.5.2 дает две ошибки о строке S<B>::ft<12>():

  1. ожидаемое первичное выражение до токена ')'
  2. недопустимые операнды типов '<неразрешенный тип перегруженной функции>' и оператор 'int' to binary '<' </i>

Comeau (http://www.comeaucomputing.com/tryitout/) в строгом режиме C ++ 03 также жалуется на эту строку, заявляя, что «ожидал выражения» , с кареткой чуть ниже закрывающей скобки. Однако ни один компилятор не жалуется на строку S<B>::f(), и Comeau может фактически скомпилировать весь минимальный пример в расслабленном режиме.

Если я удаляю шаблон g и вместо этого создаю экземпляр параметра шаблона S в g, примерно так:

void g() {
  S<true>::ft<12>();
}

int main() {
  g();
  ...

GCC успешно компилирует его, как и Comeau в строгом режиме C ++ 03.

Из второй ошибки GCC, приведенной выше, кажется, что в интерпретации S<B>::ft<12> есть неоднозначность, как будто она думает, что я пытаюсь проверить, если S<B>::ft меньше 12. Я знаю об использовании typename для устранения неоднозначностей, возникающих при обращении к типам в зависимых областях. Кто-нибудь знает, как устранить неоднозначность, когда вещь, которая появляется в зависимой области видимости, является функцией, а не типом?

1 Ответ

6 голосов
/ 26 марта 2012

Вам нужно немного помочь компилятору, сказав, что ft - это шаблон, например:

template<bool B>
struct S {
  static void f() {
  }
  template<int I>
  static void ft() {
  }
};

template<bool B>
void g() {
  S<B>::f();
  S<B>::template ft<12>();
}

int main() {
  g<true>();
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...