Проблема с вызовом шаблонного метода из шаблонного метода
У меня есть небольшая шаблонная структура, которая перенаправляет вызов другой шаблонной структуре. Это должно быть просто. Но я столкнулся с проблемой. Идея состоит в том, что структура One использует параметр шаблона для переадресации вызова в зависимости от константы времени компиляции, переданной в качестве параметра.
Вот минимальный код, который мне удалось воспроизвести:
struct OutFoo
{
template <bool Condition>
static constexpr void foo_ce() noexcept
{
}
static constexpr void foo() noexcept
{
}
};
template <typename OF>
struct InnerFoo
{
template <bool b>
static constexpr void inner_foo() noexcept
{
// OF::foo_ce<b>(); // Does not compile
// OF::foo_ce<true>(); // Does not compile
OF::foo();
}
};
int main()
{
InnerFoo<OutFoo>::inner_foo<true>();
}
Насколько я понимаю, обе закомментированные строки должны компилироваться, учитывая, что следует взять OF (иначе OutFoo, а затем вызвать foo_ce().
Это действительно работает с MSVC, но не с gcc. Кто прав? Что я делаю неправильно?
ошибка gcc:
source>: In static member function 'static constexpr void InnerFoo<OF>::inner_foo()':
<source>:22:19: error: expected primary-expression before ')' token
22 | OF::foo_ce<b>();
| ^
<source>:23:22: error: expected primary-expression before ')' token
23 | OF::foo_ce<true>();
| ^
<source>: In instantiation of 'static constexpr void InnerFoo<OF>::inner_foo() [with bool b = true; OF = OutFoo]':
<source>:30:39: required from here
<source>:22:15: error: invalid operands of types '<unresolved overloaded function type>' and 'bool' to binary 'operator<'
22 | OF::foo_ce<b>();
| ~~~~~~^~
<source>:23:15: error: invalid operands of types '<unresolved overloaded function type>' and 'bool' to binary 'operator<'
23 | OF::foo_ce<true>();
| ~~~~~~^~~~~
ошибка clang более понятна:
<source>:22:9: error: missing 'template' keyword prior to dependent template name 'foo_ce'
OF::foo_ce<b>();
^ ~~~
<source>:23:9: error: missing 'template' keyword prior to dependent template name 'foo_ce'
OF::foo_ce<true>();
^ ~~~~~~
2 errors generated.