2015-05-30 4 views
6

Я пытаюсь обход ошибки в MSVC 2015, с которой я столкнулся (см. Этот вопрос: wrong type deduction of function signature).Использование функции статического constexpr-члена, возвращающей автоматический внутренний класс

Так что я пришел с этим:

#include<Windows.h> 

namespace wreg { 

using t_oshandle  = HKEY; 

struct t_api 
{ 
    static constexpr 
    auto fnc_open_key()  { return ::RegOpenKeyExA; } 

    //this doesn't compile : 
    static constexpr auto open_key = fnc_open_key(); 

    //these don't compile either: 
    //static constexpr decltype(fnc_open_key()) open_key  = fnc_open_key(); 
    //static constexpr decltype(::RegOpenKeyExA) open_key = fnc_open_key(); 
}; 

//this does compiles and runs : 
constexpr auto open_key = t_api::fnc_open_key(); 

} // namespace wreg 


//int main(int argc ,_TCHAR* argv[]); 
{ 
    auto  hk = wreg::t_oshandle{}; 
    auto  res = wreg::t_api::open_key(HKEY_LOCAL_MACHINE ,"SOFTWARE" ,0 ,KEY_READ ,&hk); 
    //auto res = wreg::open_key(HKEY_LOCAL_MACHINE ,"SOFTWARE" ,0 ,KEY_READ ,&hk); 

    if (res == ERROR_SUCCESS) 
    { 
     res = ::RegCloseKey(hk); 
    } 
    return 0; 
} 

но он не компилируется из-за

ошибка C3779: 'WREG :: t_api :: fnc_open_key': функция, которая возвращает «автоматический 'не может использоваться до его определения

Не понимаю. Он четко определен в той точке, в которой я его использую. И кроме того, в пределах класса обычно имена, локальные для определения класса, могут использоваться до его определения/объявления.

Вопрос: Почему MSVC правильно или должен компилироваться мой код?

+0

static constexpr auto fnc_open_key() {return :: RegOpenKeyExA; } <- синтаксис вызова функции. Где скобки? Это не может быть тогда выведено к тому, что вы хотите. – AlexanderVX

+1

это не вызов функции, он возвращает указатель на функцию –

+0

Затем auto *, указатель? – AlexanderVX

ответ

0

Это больше не является проблемой. Ошибка решена в RTM VS 2015.

0

Вы можете попробовать использовать decltype на авто функции удержания:

auto fnc_open_key() -> decltype(::RegOpenKeyExA) { 
     return ::RegOpenKeyExA; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^