मेरा पूरा कोड बहुत लंबा है, लेकिन यहाँ एक टुकड़ा है कि मेरी समस्या का सार को प्रतिबिंबित करेगा है:तत्काल के बाद टेम्पलेट का विशेषज्ञता?
class BPCFGParser {
public:
...
...
class Edge {
...
...
};
class ActiveEquivClass {
...
...
};
class PassiveEquivClass {
...
...
};
struct EqActiveEquivClass {
...
...
};
struct EqPassiveEquivClass {
...
...
};
unordered_map<ActiveEquivClass, Edge *, hash<ActiveEquivClass>, EqActiveEquivClass> discovered_active_edges;
unordered_map<PassiveEquivClass, Edge *, hash<PassiveEquivClass>, EqPassiveEquivClass> discovered_passive_edges;
};
namespace std {
template <>
class hash<BPCFGParser::ActiveEquivClass>
{
public:
size_t operator()(const BPCFGParser::ActiveEquivClass & aec) const {
}
};
template <>
class hash<BPCFGParser::PassiveEquivClass>
{
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<BPCFGParser::ActiveEquivClass>’ after instantiation
BPCFGParser.h:408: error: redefinition of ‘class std::hash<BPCFGParser::ActiveEquivClass>’
/usr/include/c++/4.3/tr1_impl/functional_hash.h:44: error: previous definition of ‘class std::hash<BPCFGParser::ActiveEquivClass>’
BPCFGParser.h:445: error: specialization of ‘std::hash<BPCFGParser::PassiveEquivClass>’ after instantiation
BPCFGParser.h:445: error: redefinition of ‘class std::hash<BPCFGParser::PassiveEquivClass>’
/usr/include/c++/4.3/tr1_impl/functional_hash.h:44: error: previous definition of ‘class std::hash<BPCFGParser::PassiveEquivClass>’
अब मुझे इन कक्षाओं के लिए std :: हैश का विशेषज्ञ बनाना है (क्योंकि मानक std :: हैश परिभाषा में उपयोगकर्ता परिभाषित प्रकार शामिल नहीं हैं)। जब मैं कक्षा BPCFGParser
की परिभाषा से पहले इन टेम्पलेट विशेषज्ञता को स्थानांतरित करता हूं, तो मुझे विभिन्न प्रकार की विभिन्न चीजों के लिए कई त्रुटियां मिलती हैं, और कहीं (http://www.parashift.com/c++-faq-lite/misc-technical-issues.html) मैंने पढ़ा है कि:
जब भी आप किसी टेम्पलेट पैरामीटर के रूप में कक्षा का उपयोग करते हैं, तो घोषणा वह कक्षा पूरी होनी चाहिए और घोषित नहीं किया जाना चाहिए।
तो मैं अटक गया हूं। मैं BPCFGParser
परिभाषा के बाद टेम्पलेट्स का विशेषज्ञ नहीं हो सकता, मैं BPCFGParser
परिभाषा से पहले उन्हें विशेषज्ञ नहीं कर सकता, मैं यह कैसे काम कर सकता हूं?
आप BPCFGParser के अंदर एक आंतरिक वर्ग में विशेषज्ञता बढ़ने की जरूरत है। ऐसा करने से दोनों आवश्यकताओं को पूरा किया जाता है।
आप जवाब :)
hash
वर्ग नाम स्थान std
भीतर परिभाषित किया गया है के लिए बहुत बहुत धन्यवाद। यह मुझे गैर-नामस्थान क्षेत्र में hash
के लिए टेम्पलेट्स का विशेषज्ञ बनाने की अनुमति नहीं देता है। यहां तक कि निम्नलिखित:
template <>
class std::hash<ActiveEquivClass> {
...
काम नहीं किया।
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 में दिए गए में, किसी का दावा है कि नामस्थान कक्षाओं में परिभाषित नहीं किया जा सकता: जब मैं namespace std {}
साथ विशेषज्ञताओं लगा, हालांकि, यह अजीब त्रुटि देता है। तो मैं अभी भी अटक गया हूँ।
उत्तर के लिए बहुत बहुत धन्यवाद, लेकिन यह काम नहीं करता है। स्पष्टीकरण के लिए नीचे देखें। –