Специализация шаблона после создания экземпляра?
Мой полный код слишком длинный, но вот фрагмент, который будет отражать суть моей проблемы:
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, кто-то утверждает, что пространства имен не могут быть определены в классах. Так что я'Я все еще застрял.