मैं वंदेवोर्डे और जोसुटिस के "सी ++ टेम्पलेट्स पूर्ण गाइड" पढ़ रहा हूं (जो कि बहुत अच्छा लगता है)। यह दावा (धारा 3.3) गलत लगता है and is not in the published errata:क्या यह पाठ्य पुस्तक गलत है? कुछ सदस्य फ़ंक्शंस को विशेषज्ञता देना, लेकिन अन्य नहीं
यदि आप कक्षा टेम्पलेट का विशेषज्ञ हैं, तो आपको सभी सदस्य कार्यों को भी विशेषज्ञ बनाना होगा। यद्यपि ऐसा करने के बाद, एक सदस्य कार्य को विशेषज्ञता देना संभव है, फिर भी आप पूरी कक्षा का विशेषज्ञ नहीं बन सकते हैं।
फिर भी जीसीसी टेम्पलेट पर निम्नलिखित compiles
<typename T>
struct C {
T foo();
T bar();
};
template <>
struct C<int> {
int foo();
int bar() {return 4;}
};
template <typename T>
T C<T> :: foo() {return 0;}
template <typename T>
T C<T> :: bar() {return 1;}
int C<int> :: foo() {return 2;}
template <>
float C<float> :: bar() {return 3;}
#include <cassert>
int main() {
C<int> i;
C<float> f;
assert (2 == i .foo());
assert (0 == f .foo());
assert (4 == i .bar());
assert (3 == f .bar());
}
मैं C<int>::foo
विशेष है और C<float>::bar
तो पाठ्यपुस्तक गलत है, मानक से परे जा रहा जीसीसी है, या मैं पूरी स्थिति गलतफहमी रहा हूँ?
धन्यवाद।
आप नियम का गलत मतलब निकाला। एक बार जब आप सदस्य फ़ंक्शन को विशेष कर लेते हैं तो आप उसी प्रकार के वर्ग को विशेषज्ञ नहीं कर सकते हैं, न कि अन्य सभी प्रकारों पर। –