错误C2888从VC9迁移到VC10

时间:2010-12-28 13:58:49

标签: c++ visual-studio-2008 visual-studio-2010 visual-c++ migration

我正在尝试编译MSVC ++ 10上的解决方案和项目,这些解决方案和项目在MSVC ++ 9中运行良好,我遇到了麻烦,主要是收到以下消息:

错误C2888: 'std :: hash':无法在命名空间'tr1'中定义符号

以下代码:

namespace std {
namespace tr1 {

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

如果我可以做以下其中一项,我将非常高兴:

  • 修改代码以修复错误并干净地编译;
  • 强制编译器的行为类似于MSVC ++ 9.0。

我该怎么做? 非常感谢你提前。

2 个答案:

答案 0 :(得分:3)

hash位于VS2010的名称空间std中,因为它是C ++ 0x标准库的一部分,而不是std::tr1。只需删除tr1部分,编译器就可以了。

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;
    }
};

这是对我自己的类型的哈希的一个相当简单的修改,它成功编译。

答案 1 :(得分:1)

您必须继承这样的unary_function并且不再需要tr1

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;
             }
      };
 }