Ошибка C2888 при миграции с VC9 на VC10 - PullRequest
2 голосов
/ 28 декабря 2010

Я пытаюсь скомпилировать решения и проекты на 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 ]

3 голосов
/ 28 декабря 2010

hash находится в пространстве имен std в VS2010, поскольку является частью стандартной библиотеки 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 голос
/ 28 декабря 2010

Вы должны наследовать 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;
             }
      };
 }
...