错误:hash_map没有命名类型

时间:2016-05-26 20:57:49

标签: c++ speech-recognition

我收到一条错误消息,指出没有命名类型,如下所示:

error: ‘hash_map’ does not name a type typedef hash_map<const char*,LexUnitX*,MLexUnitFunctions> MLexUnit;

相关代码使用LexUnitX类型的结构创建自定义hash_map类型,如下所示:

typedef struct {
    int iLexUnit;                                   // lexical unit unique identifier
    const char *strLexUnit;                     // lexical unit as an array of characters (a word, a syllable, etc.)
    VLexUnit vLexUnitPronunciations;            // alternative pronunciations of the lexical unit
} LexUnitX;

VLexUnit向量的代码;向量LexUnit - 类型指针

// lexical unit transcription
typedef struct {
   int iLexUnit;                            // lexical unit id (unique correspondence id <> lexical unit in str format)
   int iLexUnitPron;                        // lexical unit id (unique correspondence id <> lexical unit + pronunciation)
   int iIndex;                              // index of the lexical unit within the lexicon file
   vector<int> vPhones;                 // phonetic transciption 
   unsigned char iPronunciation;        // pronunciation number
   unsigned char iType;                 // standard / filler / sentence delimiter
   float fProbability;                  // pronunciation probability (respect to alternative ones of the same lex unit)
   float fInsertionPenalty;         // penalty for inserting this lexical unit during decoding
} LexUnit;  

class LexiconManager;

typedef vector<LexUnit*> VLexUnit;

最后用hash_map类型将字符映射到相应的数据结构:

// maps lexical units as strings of characters to their corresponding data structure
#if defined __linux__ || defined __APPLE__ || __MINGW32__
typedef std::tr1::unordered_map<const char*,LexUnitX*,MLexUnitFunctions,MLexUnitFunctions> MLexUnit;
#elif _MSC_VER < 1700
typedef hash_map<const char*,LexUnitX*,MLexUnitFunctions> MLexUnit;
#else
    #error "unsupported platform"
#endif

我不确定我在这里做错了什么,导致错误。

2 个答案:

答案 0 :(得分:2)

好吧,如果您使用的标准库实现提供hash_map(不是标准的一部分),则需要#include <hash_map>并将其命名为std::hash_map(它已放置根据{{​​3}},在MSVC和GNU的std命名空间中。)

答案 1 :(得分:1)

如果您使用的是Visual Studio 2003(或更新版本),则应使用stdext命名空间。见https://msdn.microsoft.com/en-us/library/0d462wfh(v=vs.80).aspx

  

在Visual C ++ .NET 2003中,<hash_map><hash_set>的成员   头文件不再在std命名空间中,而是已经存在   移动到stdext命名空间。有关更多信息,请参阅stdext命名空间   信息。

_MSC_VER表(How to Detect if I'm Compiling Code With Visual Studio 2008?):

MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015)
MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013)
MSVC++ 11.0 _MSC_VER == 1700 (Visual Studio 2012)
MSVC++ 10.0 _MSC_VER == 1600 (Visual Studio 2010)
MSVC++ 9.0  _MSC_VER == 1500 (Visual Studio 2008)
MSVC++ 8.0  _MSC_VER == 1400 (Visual Studio 2005)
MSVC++ 7.1  _MSC_VER == 1310 (Visual Studio 2003)

看起来你的代码错误地检查_MSC_VER