سؤال

أنا مبتدئ الهجوم الخاطف ++.حتى الآن، جيد جدًا، لكنني في حيرة من أمري بسبب فشل السطر الذي تم التعليق عليه في الكود أدناه في التجميع

error: conversion from ‘blitz::_bz_tinyMatExpr<blitz::_bz_tinyMatrixMatrixProduct<double, double, 3, 3, 3, 3, 1, 3, 1> >’ to non-scalar type ‘const m33’ requested

أنا أستخدم Debian/Lenny (g++ 4.3.2، Blitz 0.9).إليك الكود:

#include <blitz/blitz.h>
#include <blitz/array.h>
#include <blitz/matrix.h>
#include <blitz/matexpr.h>
#include <blitz/tinymat.h>
#include <blitz/tinymatexpr.h>
#include <blitz/tinyvec.h>
#include <blitz/tinyvec-et.h>
#include <blitz/vector.h>
#include <blitz/vector-et.h>

typedef blitz::TinyVector<double,3> v3;
typedef blitz::TinyMatrix<double,3,3> m33;

int main(int,char**)
{
  const m33 a;
  const m33 b;
  m33 c;c=blitz::product(a,b);  // Compiles OK
  //const m33 d=blitz::product(a,b);  // Fails to compile.
  return 0;
}

أحب أن أكون ثابتًا إلى أقصى حد، لذلك سيكون من الجيد معرفة ما إذا كانت هناك طريقة لجعلها تعمل (تشير الخبرة مع Blitz++ حتى الآن إلى أن الأمر قد يكون مجرد مسألة اختيار الحق يشمل ... ).

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

المحلول

لقد ألقيت نظرة على الكود المصدري لـ Blitz++.بقدر ما قد يبدو الأمر مفاجئًا، إلا أن الأمر موجود لا منشئ القالب لـ TinyMatrix، ولكن هناك قالب = عامل التشغيل.هذا يعني أنك لا تستطيع أن تفعل ما تحاول القيام به.لذا أقترح نسيان كائن المصفوفة الخاص بك مقدار ثابت.أو ابحث عن طريقة أخرى مثل إنشاء مصفوفة غير ثابتة يمكنك تمريرها كمرجع ثابت كمعلمة للدالة.

الآن، من أجل المتعة فقط، الحقيقة هي أنه يمكنك نسخ رمز عامل التشغيل=() وإنشاء مُنشئ قالب جديد داخل blitz/tinymat.h منه، لكنني لن أفعل ذلك!اذا أنت حقًا تريد، وإليك الطريقة:

// Turn the following code...

template<typename T_expr>
TinyMatrix<T_numtype, N_rows, N_columns>&
operator=(_bz_tinyMatExpr<T_expr> expr)
{
    // USEFUL CODE
    return *this;
}

// ...into this :
template<typename T_expr>
TinyMatrix(_bz_tinyMatExpr<T_expr> expr)
{
    // USEFUL CODE
}

ويتم تجميع التعليمات البرمجية الخاصة بك (وربما تعمل).

نصائح أخرى

//const m33 d=blitz::product(a,b);  // Fails to compile.
const m33 d;
const_cast<m33>(d) = blitz::product(a,b);

وآسف لا أعرف مداهمات، ولكن بعض الأفكار التي قد تساعد.

هل مداهمات :: TinyMatrix ديك الصانعين المناسبة منتديات ربما حاول شكل آخر من أشكال نسخة منشئ

const m33 d( blitz::product(a,b) );

هل تطبيق الكلمة CONST القياسية مناسبا حقا؟ ربما قد تحتاج

typedef blitz::TinyMatrix<const double,3,3> const_m33;
typedef blitz::ConstTinyMatrix<double,3,3> const_m33;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top