मेरी .एच फ़ाइल:

template <typename T>
class UpdateUtils
{
public:
typedef struct {
    QList<T> file;
} TPath;

static TPath *getIdealPath(QList<TPath *> &paths);
};

मेरी .cpp फ़ाइल:

template <typename T>
TPath *UpdateUtils<T>::getIdealPath(QList<TPath *> &paths) {
   return 0;
}

यह cpp फ़ाइल में त्रुटियाँ उत्पन्न करता है:

error: C2143: syntax error : missing ';' before '*'
error: C2065: 'T' : undeclared identifier
error: C2923: 'UpdateUtils' : 'T' is not a valid template type argument for parameter 'T'

अगर मैं TPath * रिटर्न टाइप को उदा। int, यह काम करता है। क्या आप सलाह दे सकते हैं?

4
Martin Dusek 19 अक्टूबर 2018, 13:45

1 उत्तर

सबसे बढ़िया उत्तर

TPath एक नेस्टेड वर्ग है जिसे UpdateUtils के अंदर परिभाषित किया गया है, आपको इसके लिए अर्हता प्राप्त करनी चाहिए और typename कीवर्ड का उपयोग करना चाहिए। जैसे

template <typename T>
typename UpdateUtils<T>::TPath *UpdateUtils<T>::getIdealPath(QList<TPath *> &paths)
^^^^^^^^^^^^^^^^^^^^^^^^^

या @PiotrSkotnicki के सुझाव के अनुसार ट्रेलिंग रिटर्न टाइप लागू करें:

template <typename T>
auto UpdateUtils<T>::getIdealPath(QList<TPath *> &paths) -> TPath *
^^^^                                                     ^^^^^^^^^^

ध्यान दें कि वर्ग परिभाषा से बाहर सदस्य फ़ंक्शन परिभाषा के लिए, पैरामीटर-सूची और अनुगामी-वापसी-प्रकार में उपयोग किए गए नाम कक्षा के दायरे में देखे जाएंगे, इसलिए आपको उन्हें अर्हता प्राप्त करने की आवश्यकता नहीं है (हालांकि उन्हें अर्हता प्राप्त करना ठीक है)। यह रिटर्न-टाइप के लिए लागू नहीं होता है। [basic.scope.class]/4

एक घोषणा का संभावित दायरा जो एक वर्ग परिभाषा के अंत तक या उससे आगे तक फैलता है, उसकी सदस्य परिभाषाओं द्वारा परिभाषित क्षेत्रों तक भी विस्तारित होता है, भले ही सदस्यों को वर्ग के बाहर शाब्दिक रूप से परिभाषित किया गया हो (इसमें स्थिर डेटा सदस्य परिभाषाएँ, नेस्टेड वर्ग परिभाषाएँ शामिल हैं, और सदस्य फ़ंक्शन परिभाषाएं, जिसमें सदस्य फ़ंक्शन बॉडी और ऐसी परिभाषाओं के घोषणाकर्ता भाग का कोई हिस्सा शामिल है जो घोषणाकर्ता-आईडी का पालन करता है, जिसमें पैरामीटर-घोषणा-खंड और कोई डिफ़ॉल्ट तर्क शामिल है)।

9
songyuanyao 19 अक्टूबर 2018, 11:55