разница между типами указателей на функции-члены, не являющиеся шаблоном

Я пытаюсь выяснить основную причину проблемы преобразования типов с указателями на функции-члены в 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

См. также:  Ошибка компилятора пользовательского строкового литерала .. не является переменной
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Cygnus

    Это явно ошибка компилятора в VS 2012. Она выглядит тесно связанной с # 775434 «decltype не работает в VS 2012», который ссылается на этот ТАК вопрос. Если это действительно ошибка, то помимо обновления до VS 2015 вы можете попробовать обходной путь, аналогичный этому (src):

    template <typename T> T msvc_decltype_helper(T); // Never implemented.
    #define FN_DECLTYPE(...) decltype(::msvc_decltype_helper(__VA_ARGS__))
    

    Т.е. попробуй какие typeid(msvc_decltype_helper(&foo::func1<3>)).name() выводы.

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: