2011-12-20 4 views
-2

Я скомпилировал код ниже с gcc4.4.1 на Linux: -ошибка: ожидается, первичное выражение перед '<' лексем

#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 

Определение хеш файла хэш .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*> {}; 
} 

EDIT :: Мне нужно было включить пространство имен. Работа над кодом другого приводит к глупым ошибкам. Спасибо за проголосовать и помочь. :)

Любая помощь приветствуется. Благодарю.

+0

Запись 'Hash (ext_str_tab_s1)' будет не проще? – Hauleth

+1

Вы включаете то, что определяет, что такое Хэш? – tpg2114

+1

Является ли шаблонный класс 'Hash' не включенным и/или определенным в пространстве имен? Если это так, вероятно, ваша проблема. – Joe

ответ

2

Насколько я могу видеть:

  • Вы не включая "hash.h"
  • Вы закомментирована декларацию Hash шаблона, оставив только явные специализации. Вам все равно нужно объявить шаблон, даже если вы не определяете общую версию.
  • Шаблон Hash находится в пространстве имен Hash, но вы не используете это пространство имен и не полностью квалифицируете имя шаблона. (Кстати, не очень хорошая идея использовать одно и то же имя для пространства имен и класса, что может привести к двусмысленности).
  • Вы пытаетесь вызвать нестатический operator(), как если бы он был статичным; вы хотите что-то большее, как return Hash<const char*>()(ext_str_tab_s1);.

Поэтому неудивительно, что Hash не признан в качестве имени шаблона (хотя следует сказать, что сообщение об ошибке не очень полезно).

+0

@crazy_prog, это хороший ответ. И вам нужно немного отступить. Откуда появился этот код? С этим связано немало проблем. Вы сами пишете? Была ли какая-либо версия его когда-либо работала? –

2

Есть несколько возможных вариантов:

  • вы не включают в себя заголовок, где Hash шаблон определен
  • шаблон Hash находится в другом пространстве имен
1

Hash это пространство имен. Пространства имен не могут иметь параметры шаблона.

Не указывайте типы и пространства имен с одинаковым именем.