القالب التخصص الجزئي لتهيئة الحقول الثابتة
-
25-09-2019 - |
سؤال
أنا أحاول شيئًا مثل ما يلي:
struct MyType { };
template <typename T>
struct Test
{
static const MyType * const sm_object;
};
template <>
struct Test<void>
{
static const MyType * const sm_object;
};
template <typename T> const MyType * const Test<T>::sm_object = new MyType();
template <> const MyType * const Test<void>::sm_object = new MyType();
أقوم بتضمين هذا في ملفين - A.CPP و B.CPP. أحاول التجميع والحصول على:
error C2998: 'const MyType *Test<void>::sm_object' : cannot be a template definition
أفترض أن بناء جملة C ++ سيء ، لكن لا يمكنني التفكير في ما أفعله خطأ.
لا يمكنني إزالة template<>
من التعريف المتغير ، حيث أحتاج إلى هذا في وحدات ترجمة متعددة ، وهذا من شأنه أن يؤدي إلى خطأ في الارتباط.
يمكنني وضع الحقل في فئة أساسية واستخدام CRTP لإنشاء مثيل جديد لكل نوع ، ثم لن يعترض التخصص في الطريق ، ولكن لماذا لا يعمل هذا الحقل "المباشر"؟ يجب أن أفتقد قطعة من بناء الجملة.
أنا أستخدم VS2003 :(
المحلول
انطلاقا من g ++ أعتقد أنك بحاجة إلى إزالة template<>
من هذا الخط ووضع الباقي في ملف مصدر واحد فقط (ليس في الرأس). نظرًا لأنه من التخصص ، فإنه يشبه تمامًا ثابتًا طبيعيًا لا تحدده في رأس.
في بعض .C
ملف:
const MyType * const Test<void>::sm_object = new MyType();
نصائح أخرى
أعتقد أنك تريد أن تفعل شيئًا كهذا
struct MyType { };
template <typename T>
struct Test
{
static const MyType * const sm_object;
static const MyType* set_object()
{
return nullptr;
}
};
template <>
struct Test<void>
{
static const MyType * const sm_object;
static const MyType* set_object()
{
return new MyType();
}
};
template <typename T>
const MyType * Test<T>::sm_object = Test< T >::set_object();
أعتقد أن الكود التالي قد يكون ذا اهتمام كبير لبعض الناس:
#include <stdio.h>
template<class X,int Y>
struct B
{
X content;
static const int nr=Y;
};
int main(int, char**)
{
B<char,1> a;
B<int,2> b;
B<int,3> c;
printf("%d, %d, %d\n",a.nr,b.nr,c.nr);
}