Есть
такой код:
class Test
{
public:
void foo()
{
std::cout << 0 << std::endl;
}
template< int N >
void fooN()
{
std::cout << N << std::endl;
}
template< typename Fn >
void invoke( Fn&& fn )
{
(*this.*fn)();
}
};
int main( int args, char *argv[] )
{
Test test;
using Fn = decltype(&Test::fooN<1>);
test.invoke<Fn>( &Test::foo ); // В моей задаче автовыведение типа не прокатит
test.invoke<Fn>( &Test::fooN<1> );
return 0;
}
Это студия тупит или я чего-то не понимаю? В студии не компилируется — говорит, что
cannot convert argument 1 from 'void (__thiscall Test::* )(void)' to 'Fn (__thiscall &&)'.
Я так понимаю, что студия считает, что
Test::fooN<1> это перегрузка. Но, перегрузка — это когда имя метода совпадает, а сигнатуры отличаются. Тут же сигнатуры совпадают, а имена методов — хз