سؤال

أنا أحاول شيئًا مثل ما يلي:

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);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top