2014-10-28 4 views
1

Я пытаюсь скомпилировать C++ код, показанный ниже, но я получил сообщение об ошибке сказав,'hash' уже объявлен в этой области с использованием tr1 :: hash;

In file included from src/LM.h:3:0, from src/LM.cpp:1: src/common.h:30:13: error: ‘hash’ is already declared in this scope using tr1::hash;

Это команда, которую я использовал для компиляции файлов ниже.

g++ -std=c++11 -Wall src/Foo.cpp

foo.cpp

#include "Foo.h" 
... 

foo.h

#ifndef FOO_H 
#define FOO_H 
#include "common.h" 
//more code here 
#endif 

common.h

#ifndef _COMMON_H_ 
#define _COMMON_H_ 

#include <iostream> 
#include <fstream> 
#include <cmath> 
#include <cassert> 
#include <cstdlib> 
#include <utility> 
#include <vector> 
#include <string> 
#include <array> 
#include <algorithm> 
#include <set> 
#include <tr1/unordered_map> 
#include <tr1/functional> 
namespace std { 
    using tr1::unordered_map; 
    using tr1::hash; 
} // namespace std 

using namespace std; 

//more code here 
#endif 

Я хочу, чтобы исходный код для использования станд :: tr1 :: unordered_map и std :: tr1 :: hash, а не std :: unordered_map и std :: hash (A В последнее время я вношу некоторые изменения в распределенные файлы, которые используют std :: tr1 :: unordered_map и std :: tr1 :: hash).

Что, возможно, не так с моими кодами?

UPD: https://github.com/clab/fast_align/blob/master/src/port.h похоже делает то же, что и мой. Однако это компилируется без каких-либо проблем ... Есть идеи?

+1

Из интереса почему вы хотите использовать 'std :: tr1 :: hash' вместо' std :: hash'? – sjdowling

+1

Этот 'port.h' компилируется, потому что он не включает' ', который объявляет реальный 'std :: hash'. –

+0

Исходный код, который я модифицирую, использует std :: tr1 :: hash, поэтому я просто следую за ним, потому что я не знаком с этими материалами. Есть ли какая-то большая разница? – hitochan

ответ

5

В C++ 11 уже есть std::hash. Вы не можете переопределить его. Вы можете использовать другое имя для tr1::hash.

Вероятно, самая лучшая идея (если вы действительно хотите использовать std::tr1::hash/std::tr1::unordered_map вместо C++ 11 структур), чтобы написать собственное пространство имен, в котором using все структуры, которые вы хотите без std::hash/std::unordered_map.

namespace common 
{ 

using std::tr1::hash; 
using std::tr1::unordered_map; 
using std::vector; 
// and so on 

} 
+0

Спасибо :) Если std :: hash не сильно отличается от std :: tr1 :: hash, я просто использую std :: hash. – hitochan

+0

'std :: hash' и' std :: tr1 :: hash' должны быть одинаковыми в реализации C++ 11; Я был бы очень удивлен, если бы они не были! – LThode

+0

@LThode Если да, то почему существуют две реализации, которые одинаковы? – hitochan

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