C++ 错误:在'<';代币

C++ 错误:在'<';代币,c++,linux,C++,Linux,我在linux上使用gcc4.4.1编译了以下代码:- #include "glob.h" #include "netlist.h" #include "netlist_params.h" #include "netlist_abbrev.h" #include "lvs_util.h" #include "lvs_report.h" #include "lvs_data.h" #include "compare_opts.h" #include "flatten.h" #include &l

我在linux上使用gcc4.4.1编译了以下代码:-

#include "glob.h"
#include "netlist.h"
#include "netlist_params.h"
#include "netlist_abbrev.h"
#include "lvs_util.h"
#include "lvs_report.h"
#include "lvs_data.h"
#include "compare_opts.h"
#include "flatten.h"

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <math.h>
#include "hash.h"

static THREAD_PRIVATE NlStringVec*  ext_str_tab_v;
static THREAD_PRIVATE const char*   ext_str_tab_s1;
static THREAD_PRIVATE const char*   ext_str_tab_s2;


int  Netlist::ExtStrHash::operator () (NlString i) const {
  if (i.is_valid())
    ext_str_tab_s1 = (*ext_str_tab_v)[i];
  return Hash<const char*>::operator()(ext_str_tab_s1);
}
#包括“glob.h”
#包括“netlist.h”
#包括“网络列表参数”
#包括“网络列表”\u abbrev.h
#包括“lvs_util.h”
#包括“lvs_report.h”
#包括“lvs_data.h”
#包括“比较选项h”
#包括“展平.h”
#包括
#包括
#包括
#包括
#包括“hash.h”
静态线程\u私有NlStringVec*ext\u str\u tab\u v;
静态线程\u PRIVATE const char*ext\u str\u tab\u s1;
静态线程\u PRIVATE const char*ext\u str\u tab\u s2;
int Netlist::ExtStrHash::operator()(NlString i)const{
如果(i.is_valid())
外部结构表1=(*外部结构表v)[i];
返回Hash::operator()(ext_str_tab_s1);
}
错误:-

netlist_back_1.C: In member function 'int Netlist::ExtStrHash::operator()(NlString) const':
netlist_back_1.C:24: error: expected primary-expression before '<' token
netlist_back_1.C:24: error: expected primary-expression before 'const'
netlist_back_1.C:24: error: expected ';' before 'const'
netlist_back_1.C:24: error: expected unqualified-id before '>' token
netlist_back_1.C:24: error: expected initializer before '>' token
netlist\u back\u 1.C:在成员函数“int netlist::ExtStrHash::operator()(NlString)const”中:
netlist_back_1.C:24:错误:在“”标记之前应该有主表达式
netlist\u back\u 1.C:24:错误:在“>”标记之前应该有初始值设定项
hash.h文件中散列的定义:-

    namespace Hash {

      //  template <class Key> struct Hash { };

    #define DECL_SIMPLE_HASH(type) \
    template <> \
    struct Hash<type> { \
      unsigned int operator() (type x) const { return x; } \
    }

      DECL_SIMPLE_HASH(signed char);
      DECL_SIMPLE_HASH(unsigned char);
      DECL_SIMPLE_HASH(signed short);
      DECL_SIMPLE_HASH(unsigned short);
      DECL_SIMPLE_HASH(signed int);
      DECL_SIMPLE_HASH(unsigned int);
      DECL_SIMPLE_HASH(signed long);
      DECL_SIMPLE_HASH(unsigned long);
      DECL_SIMPLE_HASH(signed long long);
      DECL_SIMPLE_HASH(unsigned long long);

    #undef DECL_SIMPLE_HASH

      template <>  
      class Hash<const char*> {
        static const int M = 61; // 5;

      public:

        unsigned int  operator() (const char* s) const {
          // case insensitive, so sensitivity can be turned on/off without
          // effecting hash #.
          unsigned h = 0;
          char c;
          while (c = *s++) {
        if (c >= 'A' && c <= 'Z')
          c = c - 'A' + 'a';
        h = M*h + c;
          }
          return h;
        }
      };

      template <> struct Hash<char*> : public Hash<const char*> {};
}
名称空间散列{
//模板结构哈希{};
#定义DECL\u简单\u散列(类型)\
模板\
结构哈希{\
无符号整数运算符()(类型x)常量{return x;}\
}
DECL_简单_散列(有符号字符);
DECL_简单_散列(无符号字符);
DECL_简单_散列(符号短);
DECL_简单_散列(无符号短);
DECL_简单_散列(有符号整数);
DECL_简单_散列(无符号整数);
DECL_简单_散列(长符号);
DECL_简单_散列(无符号长);
DECL_简单_散列(有符号长);
DECL_简单_散列(无符号长);
#未定义DECL\u简单\u散列
模板
类散列{
静态常数int M=61;//5;
公众:
无符号整数运算符()(const char*s)const{
//不区分大小写,因此可以在不区分大小写的情况下打开/关闭灵敏度
//影响散列#。
无符号h=0;
字符c;
而(c=*s++){

如果(c>='A'&&c有几个可能的选项:

  • 您没有包括定义
    哈希
    模板的标题
  • 模板
    Hash
    位于不同的命名空间中

哈希是命名空间。命名空间不能有模板参数

不要给类型和名称空间赋予相同的名称。

据我所知:

  • 您没有包括
    “hash.h”
  • 您已经注释掉了
    散列
    模板的声明,只留下了显式的专门化。您仍然需要声明模板,即使您没有定义通用版本
  • Hash
    模板位于名称空间
    Hash
    中,但您既不使用该名称空间,也不完全限定模板名称。(顺便说一下,对名称空间和类使用相同的名称不是一个好主意;它可能会导致歧义)
  • 您试图调用一个非静态的
    操作符()
    ,就好像它是静态的;您想要的东西更像
    return Hash()(ext\u str\u tab\u s1);

因此,
Hash
没有被识别为模板名称也就不足为奇了(尽管必须说错误消息没有多大帮助)。

Write
Hash(ext\u str\u tab\u s1)
不会更容易吗?您是否包含定义哈希的内容?模板类
哈希是否未包含和/或定义在命名空间中?如果是,这可能是您的问题。看起来编译器没有将
哈希
识别为一种类型…它在哪里声明(在哪个命名空间中)我同意你们提出的问题肯定是一样的,但很难找到out@crazy_prog,这是一个很好的答案。而且,你需要退一步。这段代码是从哪里来的?它有很多问题。你自己写的吗?它的任何版本都有效吗?