سؤال

هذه نسخة مصبوبة إلى حد ما من مستندات التعزيز وأواصل الحصول على خطأ (في الواقع الكثير من الأخطاء)

أحاول التأكد من استخدام فئة القالب فقط مع الأرقام باستخدام Boost. هذا تمرين في دفعة ، بدلاً من صنع فئة قالب لا يستخدم إلا الأرقام.

#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_arithmetic.hpp>

using namespace boost;

template <class T>
class A<T, typename enable_if<is_arithmetic<T> >::type> // <-- this is line 9
{
    int foo;
};

int main() {

    return 0;
}

الأخطاء القليلة الأولى C2143: خطأ بناء الجملة: مفقود "؛" قبل '<': السطر 9 C2059: خطأ في بناء الجملة: '<': السطر 9 C2899: لا يمكن استخدام اسم typename خارج إعلان القالب

Visual Studio 2005 راجع للشغل.

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

المحلول

لم تنشأ أبدًا قالب الفصل المسمى A. لقد قمت للتو بإنشاء أ تخصص. تحتاج أولاً إلى إنشاء ملف A قالب الفصل مع معلمة وهمية للعامل التمكين للعمل.

using namespace boost;

template <class T, class Enable = void>
class A { };

template <class T>
class A<T, typename enable_if<is_arithmetic<T> >::type> 
{
    int foo;
};

نصائح أخرى

قبل التخصص A قالب الفصل عليك أن تعلن ذلك على الأقل.

يعتمد الحل على ما تحاول تحقيقه ، لأن المشكلة التي تطلبها من المساعدة هي حل لمحاولة بعض المشكلات.

ال تعزيز الوثائق من enable_if لديه هذا المثال ، والذي ربما هو ما تريده:

template <class T, class Enable = void> 
class A { ... };

template <class T>
class A<T, typename enable_if<is_integral<T> >::type> { ... };

template <class T>
class A<T, typename enable_if<is_float<T> >::type> { ... };

هتاف و هول. ،

لأنك في عداد المفقودين ::type في نهايةالمطاف. يمكن أن يكون بناء enable_if خطأ في بعض الأحيان. أستخدم هذا الماكرو الصغير لتسهيل:

#define CLASS_REQUIRES(...) typename boost::enable_if<boost::mpl::and_<__VA_ARGS__, boost::mpl::bool_<true> > >::type

ثم يمكنك كتابة الرمز أعلاه مثل هذا:

template <class T, class Enable = CLASS_REQUIRES(is_arithmetic<T>)>
class A 
{
    int foo;
};

إنه أسهل كثيرًا على العيون.

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