Я пытаюсь выяснить основную причину проблемы преобразования типов с указателями на функции-члены в 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
Это явно ошибка компилятора в VS 2012. Она выглядит тесно связанной с # 775434 «decltype не работает в VS 2012», который ссылается на этот ТАК вопрос. Если это действительно ошибка, то помимо обновления до VS 2015 вы можете попробовать обходной путь, аналогичный этому (src):
Т.е. попробуй какие
typeid(msvc_decltype_helper(&foo::func1<3>)).name()
выводы.