C++11 compiler error when using decltype(var) followed by internal type of “var”

后端 未结 2 824
青春惊慌失措
青春惊慌失措 2021-01-17 22:47

I\'m using Visual C++ 2010, and here\'s my code snippet:

std::set s;
decltype(s)::value_type param = 0;

I got the following erro

相关标签:
2条回答
  • 2021-01-17 23:20

    This is a Visual Studio bug that was raised last year on Connect. It is issue 757545 ("Cannot use decltype before scope operator").

    The issue has a workaround listed alongside it that is effectively the same as @iammillind's, except it uses std::identity that was removed from <functional> shortly prior to the publication of C++11, for whatever reason. (std::common_type with one template parameter is equivalent; std::remove_reference is the same in some cases.)

    0 讨论(0)
  • 2021-01-17 23:24

    I see that with g++ 4.7.2 version, the code compiles fine. So it could be a compiler bug in MSVS.
    For time being you can try below trick:

    #ifdef COMPILER_BUG_STILL_THERE
    template<typename T> struct Get { typedef T type; };
    #define DECLTYPE(VAR) Get<decltype(VAR)>::type
    #else
    #define DECLTYPE(VAR) decltype(VAR)
    #endif
    

    Use it as:

    DECLTYPE(s)::value_type param = 0;
    

    Disclaimer: Ofcourse with this trick, you may have to use typename when inside templates. For that you can have 1 more macro such as #define TDECLTYPE(VAR) typename DECLTYPE(VAR)

    0 讨论(0)
提交回复
热议问题