Я пытаюсь выяснить основную причину проблемы преобразования типов с указателями на функции-члены в C ++ (VS2012).
Я сузил его до разницы в typeid указателя на функцию-член шаблона и функцию-член, не являющуюся шаблоном. Рассмотрим код:
#include <typeinfo> #include <iostream> class foo { public: template<int k> void func1() {} void func2() {} }; typedef void (foo::*foofunc)(); int main() { //this gives «int» std::cout<<typeid(&foo::func1<3>).name()<<std::endl; //this gives «void (__thiscall *)(void)» std::cout<<typeid(&foo::func2).name()<<std::endl; return 0; }
func2 имеет ожидаемое значение. Почему указатель на func1 имеет тип int, если обе функции-члены одного и того же класса?
ПРИМЕЧАНИЕ. Это происходит только в Windows.
В GCC 4.8 они оба печатают M3fooFvvE — person Cygnus schedule 19.11.2015
@PaoloM: Ага. Я не уверен, почему имя неясно, но, по крайней мере, они оба имеют один и тот же тип с GCC. — person Cygnus schedule 19.11.2015
Что вы имеете в виду под непонятным? Кстати, это из cppreference: нет гарантии, что то же На экземпляр std :: type_info будут ссылаться все вычисления выражения typeid для одного и того же типа, хотя std :: type_info :: hash_code этих объектов type_info будет идентичным, как и их std :: type_index. — person Cygnus schedule 19.11.2015
Источник: