كيفية إنشاء تيبيديف ل "دفعة:: أراي_فيو" في فئة قالب

StackOverflow https://stackoverflow.com//questions/22064962

  •  23-12-2019
  •  | 
  •  

سؤال

أريد أن يكون قالب الملحد الأبعاد (مفيدة لكل من 3 و 4 د) ، سيتم تنفيذ معظم العمليات على سوباتريسس مع البعد الأول جردت.

حتى هنا هو ما أود أن يكون

template <typename element, int dimensions>
class MMapMatrixTemplate{
public:
    typedef boost::multi_array_ref<element, dimensions> array_type; 
    typedef std::array<size_t, dimensions> index_type;
    typedef array_type::array_view<dimensions-1>::type stride_type;
};

أين array_type يحدد المصفوفة التي تديرها هذه الفئة index_type يحدد النوع المستخدم لفهرسة المصفوفات ، وأود `stride_type لتحديد شريحة من هذه المصفوفة لها بعد واحد أقل.

الآن أحصل على خطأ:

  include/MMapMatrix.hh:31:55: error: non-template ‘array_view’ used as template
   typedef boost::multi_array_ref<element, dimensions>::array_view<dimensions-1>::type stride_type;
                                                   ^
هل كانت مفيدة؟

المحلول

من ال الوثائق في المشاهدات ، يمكنك رؤية تعريف نوع العرض على أنه:

  typedef typename Array::template array_view<3>::type view1_t;

لذلك هذا يجعل التعليمات البرمجية الخاصة بك ترجمة:

#include "boost/multi_array.hpp"

template <typename element, int dimensions>
class MMapMatrixTemplate{
public:

    typedef boost::multi_array_ref<element, dimensions> array_type; 

    typedef std::array<size_t, dimensions> index_type;

    //typedef array_type::array_view<dimensions-1>::type stride_type;
    typedef typename array_type::template array_view<dimensions-1>::type stride_type;
};

int main(int argc, const char *argv[])
{

    typedef MMapMatrixTemplate<double, 4> matrix;

    return 0;
}

تحتاج إلى تحديد أن array_view هو في الواقع قالب فئة من أجل استخدامه على هذا النحو.خلاف ذلك ، يتوقع المترجم أن يكون من النوع المحدد بالكامل.

نصائح أخرى

تحتاج typename و / أو .template التأهيل على الأسماء التابعة:

typedef typename array_type::array_view<dimensions-1>::type stride_type;

إذا كنت تستخدم عضوا في قالب باسم تابع ، فأنت بحاجة إلى .template المؤهل:

obj.template foo<T>();

شاهد هذه الإجابة الشائعة جدا للخلفية

أين ولماذا لا بد لي من وضع" قالب "و" اسم النوع " الكلمات الرئيسية?

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