टेम्पलेट अमूर्त वर्ग से इनहेरिट करना

Nov 24 2020

मेरे पास यह कोड संरचना है:

  • एक सार वर्ग ए (यह एक शुद्ध आभासी विधि है)
  • एक वर्ग टेम्पलेट बी जो ए से विरासत में मिला है
  • एक वर्ग टेम्पलेट सी जो बी से विरासत में मिला है
class A
{
protected:
    int u;
    int z;

public:
    A(int uu,
      int zz)
    :u(uu),
     z(zz)
    {};

    int get() const
    {
    return u;
    };

    virtual void blah() = 0;
};

template <class T>
class B : public A
{
protected:
    std::vector<T> xxxx;
public:
    B(int uu,
      int zz,
      int bbb)
    :A(uu,
       zz)
    {
    for(size_t i = 0; i < bbb; i ++)
        xxxx[i] = 0;
    };

    virtual void blah()
    {
    u = u + 1;
    };
};

template <class T>
class C : public B<T>
{
protected:
    int qrqr;

public:
    C(int uu,
      int zz,
      int bbb,
      int qrqrqr)
    :B<T>(uu,
          zz,
          bbb),
     qrqr(qrqrqr)
    {
    };

    virtual void blah()
    {
    u = u + qrqr;
    };
};

जब मैं संकलित करता हूं तो मुझे यह त्रुटि मिलती है:

 
error: 'u' was not declared in this scope
    at line:  u = u + qrqr;

हालांकि uस्पष्ट रूप से C का एक तत्व है क्योंकि A, B के माध्यम से C का आधार है।

मैं यहाँ पढ़ता हूँ: क्लास टेम्प्लेट इनहेरिटेंस C ++ कि क्लास टेम्प्लेट से इनहेरिट करने का उचित तरीका या तो क्लास को स्पेशलाइज़ करना है या इनहेरिटेड क्लास को टेम्प्लेट होना है और यही मैंने यहाँ किया है। संकलक को इसके बारे में वैसे भी शिकायत नहीं है। क्या ऐसा हो सकता है क्योंकि A एक अमूर्त वर्ग है?

मैंने गलत क्या किया?

धन्यवाद!

जवाब

1 AmiTavory Nov 24 2020 at 16:08

यह एक भरोसेमंद नाम के साथ एक समस्या है - जिस सदस्य का आप उल्लेख कर रहे हैं वह टेम्पलेट पैरामीटर पर निर्भर नहीं करता है। संकलक आश्रित आधार वर्गों (जैसे B<T>) में नहीं दिखता है जब आश्रित नाम (जैसे u) देखते हैं।

आप इसका उपयोग करके हल कर सकते हैं

this->u = this->u + qrqr;

जो संकलक को निर्दिष्ट करता है, जिसका uअर्थ है।

( कोलीरू )

इस लाइन से पहले फ़ंक्शन में कॉल B<T>::uया लिखकर कम से कम दो अन्य तरीके हैं using B<T>::u;

इसके बारे में यहाँ और पढ़ें ।