كيفية إنشاء تيبيديف ل "دفعة:: أراي_فيو" في فئة قالب
-
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>();
شاهد هذه الإجابة الشائعة جدا للخلفية