الوظيفة العادية لا وظيفة قالب الكتابة
-
04-10-2019 - |
سؤال
لا بد لي من استخدام مكتبة خارجية ، لكنني أحصل على "خطأ في التعريف المتعدد" من وظيفة القالب التالية وتخصصها الصريح ، إذا تم استدعاؤها باستخدام Std :: String.
template <typename T>
void foo(T& value);
template <>
void foo(std::string& value);
حتى لو قمت بتغيير الوظيفة الثانية إلى
void foo(std::string& value);
المشكلة هي نفسها.
وفقًا لـ [1] على الأقل ، ينبغي تفضيل الإصدار بدون قالب ("الوظيفة القديمة البسيطة") على إصدار القالب.
هل لدى أي شخص أدنى فكرة ، حيث يمكن أن تكون المشكلة؟
المحلول
أنت تكسر قاعدة الوصلة الواحدة.
ما لم تكن الوظيفة inline
, ، لا يمكن تعريفها إلا مرة واحدة. إذا قمت بمناسبة الوظيفة كـ inline
, ، طالما تتطابق التعريفات ، يمكن تعريفها كما هو مطلوب. تتصرف وظائف القالب كما لو كانت ضمنية inline
, ، لذلك لا تحصل على أخطاء مع القوالب.
ومع ذلك ، فإن التخصص الصريح أو الوظيفة غير المسلمة ليس ضمنيًا inline
ولأنك تضمنها في وحدات ترجمة متعددة ، تحصل على تعريفات متعددة ؛ هذا يكسر القاعدة. يجب عليك وضع علامة عليها على أنها inline
:
template <>
inline void foo(std::string& value);
(إذا كنت تحصل على هذا قبل وقت الارتباط ، فأنت بحاجة إلى تشمل الحراس.)