错误:'<'之前的预期primary-expression代币

时间:2011-12-20 20:10:53

标签: 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 <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);
}

错误: -

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

文件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*> {};
}

编辑::我需要包含命名空间。处理其他代码会导致愚蠢的错误。 感谢投票和帮助。 :)

感谢任何帮助。感谢。

3 个答案:

答案 0 :(得分:2)

几种可能的选择:

  • 您未包含定义Hash模板的标题
  • 模板Hash位于不同的名称空间

答案 1 :(得分:2)

据我所见:

  • 您不包括"hash.h"
  • 您已注释掉Hash模板的声明,只留下明确的专精。即使您没有定义通用版本,仍需要声明模板。
  • Hash模板位于命名空间Hash内,但您既不使用该命名空间也不完全限定模板名称。 (顺便说一句,对名称空间和类使用相同的名称并不是一个好主意;它可能导致含糊不清)。
  • 您正试图将非静态operator()称为静态;你想要更像return Hash<const char*>()(ext_str_tab_s1);
  • 的东西

因此,Hash未被识别为模板名称也就不足为奇了(尽管必须说错误消息不是很有用)。

答案 2 :(得分:1)

Hash是一个命名空间。命名空间不能包含模板参数。

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