Предположим, у меня есть шаблон статической функции 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>()
:
- ожидаемое первичное выражение до токена ')'
- недопустимые операнды типов '<неразрешенный тип перегруженной функции>' и оператор '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
для устранения неоднозначностей, возникающих при обращении к типам в зависимых областях. Кто-нибудь знает, как устранить неоднозначность, когда вещь, которая появляется в зависимой области видимости, является функцией, а не типом?