Специализация шаблона после создания экземпляра?

Мой полный код слишком длинный, но вот фрагмент, который будет отражать суть моей проблемы:

class BPCFGParser {
  public:

  ...
  ...

  class Edge {
    ...
    ...
  };


  class ActiveEquivClass {
    ...
    ...
  };

  class PassiveEquivClass {
    ...
    ...
  };

  struct EqActiveEquivClass {
    ...
    ...
  };

  struct EqPassiveEquivClass {
    ...
    ...
  };



  unordered_map discovered_active_edges;
  unordered_map discovered_passive_edges;

};

namespace std {


template 
class hash
{

    public:
        size_t operator()(const BPCFGParser::ActiveEquivClass & aec) const {

        }
};

template 
class hash
{

    public:
        size_t operator()(const BPCFGParser::PassiveEquivClass & pec) const {

        }
};

}

Когда я компилирую этот код, я получаю следующие ошибки:

In file included from BPCFGParser.cpp:3,
                 from experiments.cpp:2:
BPCFGParser.h:408: error: specialization of ‘std::hash’     after instantiation
BPCFGParser.h:408: error: redefinition of ‘class                 std::hash’
/usr/include/c++/4.3/tr1_impl/functional_hash.h:44: error: previous definition of     ‘class std::hash’
BPCFGParser.h:445: error: specialization of     ‘std::hash’ after instantiation
BPCFGParser.h:445: error: redefinition of ‘class std::hash’
/usr/include/c++/4.3/tr1_impl/functional_hash.h:44: error: previous definition of     ‘class std::hash’

Теперь я должен специализировать std :: hash для этих классов (потому что стандартное определение std :: hash не включает определяемые пользователем типы). Когда я перемещаю эти шаблонные специализации до определения классаBPCFGParserЯ получаю множество ошибок за разные разные вещи пробовал и где-то (http://www.parashift.com/c++-faq-lite/misc-technical-issues.html) Я прочитал это:

Всякий раз, когда вы используете класс в качестве параметра шаблона, объявление этого класса должно быть полным, а не просто объявлено вперед.

Так что я'Я застрял. Я не могу специализировать шаблоны послеBPCFGParser определение, я не могу специализировать их раньшеBPCFGParser определение, как я могу получить это работает?

Вам нужно переместить специализацию во внутренний класс внутри BPCFGParser. Это соответствует обоим требованиям.

Большое спасибо за ответ :)

hash класс определяется в пространстве именstd, Это не позволяет мне специализировать шаблоны дляhash в не-пространстве имен. Даже следующее:

template 
  class std::hash {
...

не работал. Когда я прилагаю специализации сnamespace std {}однако, это дает странную ошибку:

In file included from BPCFGParser.cpp:3,
                 from experiments.cpp:2:
BPCFGParser.h:225: error: expected unqualified-id before ‘namespace’
experiments.cpp:7: error: expected `}' at end of input
BPCFGParser.h:222: error: expected unqualified-id at end of input

В ответе, приведенном вvelocityreviews, кто-то утверждает, что пространства имен не могут быть определены в классах. Так что я'Я все еще застрял.

Ответы на вопрос(5)

Ваш ответ на вопрос