سؤال

لا بد لي من استخدام مكتبة خارجية ، لكنني أحصل على "خطأ في التعريف المتعدد" من وظيفة القالب التالية وتخصصها الصريح ، إذا تم استدعاؤها باستخدام Std :: String.

template <typename T>
void foo(T& value);

template <>
void foo(std::string& value);

حتى لو قمت بتغيير الوظيفة الثانية إلى

void foo(std::string& value);

المشكلة هي نفسها.

وفقًا لـ [1] على الأقل ، ينبغي تفضيل الإصدار بدون قالب ("الوظيفة القديمة البسيطة") على إصدار القالب.

هل لدى أي شخص أدنى فكرة ، حيث يمكن أن تكون المشكلة؟

[1] http://www.gotw.ca/publications/mill17.htm

هل كانت مفيدة؟

المحلول

أنت تكسر قاعدة الوصلة الواحدة.

ما لم تكن الوظيفة inline, ، لا يمكن تعريفها إلا مرة واحدة. إذا قمت بمناسبة الوظيفة كـ inline, ، طالما تتطابق التعريفات ، يمكن تعريفها كما هو مطلوب. تتصرف وظائف القالب كما لو كانت ضمنية inline, ، لذلك لا تحصل على أخطاء مع القوالب.

ومع ذلك ، فإن التخصص الصريح أو الوظيفة غير المسلمة ليس ضمنيًا inline ولأنك تضمنها في وحدات ترجمة متعددة ، تحصل على تعريفات متعددة ؛ هذا يكسر القاعدة. يجب عليك وضع علامة عليها على أنها inline:

template <>
inline void foo(std::string& value);

(إذا كنت تحصل على هذا قبل وقت الارتباط ، فأنت بحاجة إلى تشمل الحراس.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top