возвращает decltype (auto) в статическом методе. Получает ошибку (vs2017), но работает в (vs2012). - PullRequest
0 голосов
/ 07 января 2019
static decltype(auto) Get(XML_Serializer& arcSer)
{
    return TDataConverter<TDataConverterAttribute>::Get(arcSer, DT_TypeDescriptor::Instance().GetAttribute<TVal, DT_DataConverterAttribute>());
};

typedef typename DT_TypeManipulation::RemoveReference<decltype(Get(*reinterpret_cast<XML_Serializer*>(NULL)))>::Result  Type;

не работает в C ++ 14 (visual stdio 2017 / C ++ 17)

ошибка C3779: «XML_TDataConverterProvider :: Get»: функция, которая возвращает «decltype (auto)», не может быть использована до того, как она будет определена

template<class TVal>
class XML_TDataConverterProvider
{
   private:
        template<class TDataConverterAttribute>
        struct TDataConverter
        {
            static auto Get(XML_Serializer& arcSer, TDataConverterAttribute apcDataConverterAttribute)
            -> decltype(apcDataConverterAttribute->GetDataConverter())
            {
                ASSERT(apcDataConverterAttribute);
                return apcDataConverterAttribute->GetDataConverter();
            }
        };

        template<>
        struct TDataConverter<DT_DataConverterAttribute const* const>
        {
            static DT_DataConverter& Get(XML_Serializer& arcSer, DT_DataConverterAttribute const* const apcDataConverterAttribute)

            {
                ASSERT(!apcDataConverterAttribute);
                if (apcDataConverterAttribute) {}
                return arcSer.mcConv;
            }
        };
        typedef decltype(DT_TypeDescriptor::Instance().GetAttribute<TVal, DT_DataConverterAttribute>()) TDataConverterAttribute;

    public:
        static auto Get(XML_Serializer& arcSer)
        -> decltype(TDataConverter<TDataConverterAttribute>::Get(arcSer, DT_TypeDescriptor::Instance().GetAttribute<TVal, DT_DataConverterAttribute>()))
        {
            return TDataConverter<TDataConverterAttribute>::Get(arcSer, DT_TypeDescriptor::Instance().GetAttribute<TVal, DT_DataConverterAttribute>());
        };


        typedef typename DT_TypeManipulation::RemoveReference<decltype(Get(*reinterpret_cast<XML_Serializer*>(NULL)))>::Result  Type;

};

и это работает в Visual Studio 2012 / C ++ 11

Что нужно изменить в коде C ++ 11 для запуска этого кода?

...