开发者

Error C2888 migrating from VC9 to VC10

I am trying to compile solutions and proj开发者_运维知识库ects on MSVC++ 10 that worked fine in MSVC++ 9, and I am having trouble with it, mostly getting the following message:

error C2888: 'std::hash' : symbol cannot be defined within namespace 'tr1'

on the following code:

namespace std {
namespace tr1 {

template <>
struct hash< Rubedo::eChannelFamily >
{
    std::size_t operator()( const Rubedo::eChannelFamily& Key ) const
    {
        return ( int ) Key;
    }
};
}}

I would be perfectly happy if I could do one of the following:

  • Modify the code to fix the bugs and compile cleanly;
  • Force the compiler to behave like MSVC++ 9.0.

How would I do something like that? Thank you very much in advance.


hash is in namespace std in VS2010, as it's part of C++0x's Standard library, not std::tr1. Just remove the tr1 section and the compiler should be fine.

template<> class std::hash< Rubedo::eChannelFamily >>
    : public std::unary_function<const Rubedo::eChannelFamily, size_t>
{
public:
    size_t operator()(const Rubedo::eChannelFamily& ref) const {
        return ( int ) ref;
    }
};

This is a fairly trivial modification of a hash I have for my own type which compiles successfully.


You've to inherit unary_function like this and tr1 is not needed anymore,

namespace std 
 {
       template <>
       struct hash<Rubedo::eChannelFamily> : public unary_function<Rubedo::eChannelFamily, size_t>
       {
             size_t operator()(const Rubedo::eChannelFamily& key) const
             {
                   return (size_t) key;
             }
      };
 }
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜