Note that there are some explanatory texts on larger screens.

plurals
  1. POundefined reference linking error on calling constructor of struct in C++
    text
    copied!<p>using almath functions in Nao Sdk I had this error undefined reference to `AL::Math::Transform::Transform()'</p> <p>this is the header " altransform.h "</p> <pre><code>#pragma once #ifndef _LIBALMATH_ALMATH_TYPES_ALTRANSFORM_H_ #define _LIBALMATH_ALMATH_TYPES_ALTRANSFORM_H_ #include &lt;vector&gt; namespace AL { namespace Math { /// &lt;summary&gt; /// A homogenous transformation matrix. /// /// &lt;/summary&gt; /// &lt;A HREF="http://en.wikipedia.org/wiki/Transformation_matrix"&gt;more information&lt;/A&gt; /// \ingroup Types struct Transform { /** \cond PRIVATE */ float r1_c1, r1_c2, r1_c3, r1_c4; float r2_c1, r2_c2, r2_c3, r2_c4; float r3_c1, r3_c2, r3_c3, r3_c4; /** \endcond */ /// &lt;summary&gt; /// Create a Transform initialized to identity. /** * * \f$ \left[\begin{array}{cccc} * r_1c_1 &amp; r_1c_2 &amp; r_1c_3 &amp; r_1c_4 \\ * r_2c_1 &amp; r_2c_2 &amp; r_2c_3 &amp; r_2c_4 \\ * r_3c_1 &amp; r_3c_2 &amp; r_3c_3 &amp; r_3c_4 \\ * 0.0 &amp; 0.0 &amp; 0.0 &amp; 1.0 * \end{array}\right] = * \left[\begin{array}{cccc} * 1.0 &amp; 0.0 &amp; 0.0 &amp; 0.0 \\ * 0.0 &amp; 1.0 &amp; 0.0 &amp; 0.0 \\ * 0.0 &amp; 0.0 &amp; 1.0 &amp; 0.0 \\ * 0.0 &amp; 0.0 &amp; 0.0 &amp; 1.0 * \end{array}\right]\f$ */ /// &lt;/summary&gt; Transform() ; /// &lt;summary&gt; /// Create a Transform with an std::vector. /// &lt;/summary&gt; /// &lt;param name="pFloats"&gt; /// An std::vector&lt;float&gt; of size 12 or 16 for respectively: /// /** * * \f$ \left[\begin{array}{cccc} * r_1c_1 &amp; r_1c_2 &amp; r_1c_3 &amp; r_1c_4 \\ * r_2c_1 &amp; r_2c_2 &amp; r_2c_3 &amp; r_2c_4 \\ * r_3c_1 &amp; r_3c_2 &amp; r_3c_3 &amp; r_3c_4 \\ * 0.0 &amp; 0.0 &amp; 0.0 &amp; 1.0 * \end{array}\right] = * \left[\begin{array}{cccc} * pFloats[00] &amp; pFloats[01] &amp; pFloats[02] &amp; pFloats[03] \\ * pFloats[04] &amp; pFloats[05] &amp; pFloats[06] &amp; pFloats[07] \\ * pFloats[08] &amp; pFloats[09] &amp; pFloats[10] &amp; pFloats[11] \\ * 0.0 &amp; 0.0 &amp; 0.0 &amp; 1.0 * \end{array}\right]\f$ */ explicit Transform(const std::vector&lt;float&gt;&amp; pFloats); /// &lt;summary&gt; /// Create a Transform initialized with explicit value for translation /// part. Rotation part is set to identity. /** * * \f$ \left[\begin{array}{cccc} * r_1c_1 &amp; r_1c_2 &amp; r_1c_3 &amp; r_1c_4 \\ * r_2c_1 &amp; r_2c_2 &amp; r_2c_3 &amp; r_2c_4 \\ * r_3c_1 &amp; r_3c_2 &amp; r_3c_3 &amp; r_3c_4 \\ * 0.0 &amp; 0.0 &amp; 0.0 &amp; 1.0 * \end{array}\right] = * \left[\begin{array}{cccc} * 1.0 &amp; 0.0 &amp; 0.0 &amp; pPosX \\ * 0.0 &amp; 1.0 &amp; 0.0 &amp; pPosY \\ * 0.0 &amp; 0.0 &amp; 1.0 &amp; pPosZ \\ * 0.0 &amp; 0.0 &amp; 0.0 &amp; 1.0 * \end{array}\right]\f$ */ /// &lt;/summary&gt; /// &lt;param name="pPosX"&gt; the float value for translation x &lt;/param&gt; /// &lt;param name="pPosY"&gt; the float value for translation y &lt;/param&gt; /// &lt;param name="pPosZ"&gt; the float value for translation z &lt;/param&gt; Transform( const float&amp; pPosX, const float&amp; pPosY, const float&amp; pPosZ); /// &lt;summary&gt; /// Overloading of operator *= for Transform. /// &lt;/summary&gt; /// &lt;param name="pT2"&gt; the second Transform &lt;/param&gt; Transform&amp; operator*= (const Transform&amp; pT2); /// &lt;summary&gt; /// Overloading of operator * for Transform. /// &lt;/summary&gt; /// &lt;param name="pT2"&gt; the second Transform &lt;/param&gt; Transform operator* (const Transform&amp; pT2) const; /// &lt;summary&gt; /// Overloading of operator == for Transform. /// &lt;/summary&gt; /// &lt;param name="pT2"&gt; the second Transform &lt;/param&gt; bool operator==(const Transform&amp; pT2) const; /// &lt;summary&gt; /// Overloading of operator != for Transform. /// &lt;/summary&gt; /// &lt;param name="pT2"&gt; the second Transform &lt;/param&gt; bool operator!=(const Transform&amp; pT2) const; /// &lt;summary&gt; /// Check if the actual Transform is near the one /// given in argument. /// /// &lt;/summary&gt; /// &lt;param name="pT2"&gt; the second Transform &lt;/param&gt; /// &lt;param name="pEpsilon"&gt; an optionnal epsilon distance: Default: 0.0001 &lt;/param&gt; /// &lt;returns&gt; /// true if the distance between the two Transform is less than pEpsilon /// &lt;/returns&gt; bool isNear( const Transform&amp; pT2, const float&amp; pEpsilon=0.0001f) const; /// &lt;summary&gt; /// Check if the rotation part is correct. /// The condition checks are: /// \f$R^t * R = I\f$ /// and /// determinant(R) = 1.0 /// /// &lt;/summary&gt; /// &lt;param name="pEpsilon"&gt; an optionnal epsilon distance. Default: 0.0001 &lt;/param&gt; /// &lt;returns&gt; /// true if the Transform is correct /// &lt;/returns&gt; bool isTransform( const float&amp; pEpsilon=0.0001f) const; /// &lt;summary&gt; /// Compute the norm translation part of the actual Transform: /// /// \f$\sqrt{pT.r_1c_4^2+pT.r_2c_4^2+pT.r_3c_4^2}\f$ /// &lt;/summary&gt; /// &lt;returns&gt; /// the float norm of the Transform /// &lt;/returns&gt; float norm() const; /// &lt;summary&gt; /// Compute the determinant of rotation part of the actual Transform: /// /** * \f$pT.r_1c_1*pT.r_2c_2*pT.r_3c_3 + pT.r_1c_2*pT.r_2c_3*pT.r_3c_1 + * pT.r_1c_3*pT.r_2c_1*pT.r_3c_2 - pT.r_1c_1*pT.r_2c_3*pT.r_3c_2 - * pT.r_1c_2*pT.r_2c_1*pT.r_3c_3 - pT.r_1c_3*pT.r_2c_2*pT.r_3c_1\f$ */ /// &lt;/summary&gt; /// &lt;returns&gt; /// the float determinant of rotation Transform part /// &lt;/returns&gt; float determinant() const; /// &lt;summary&gt; /// Compute the transform inverse of the actual Transform: /// /** * \f$ pT = \left[\begin{array}{cc}R &amp; r \\ * 0_{31} &amp; 1 \end{array}\right]\f$ */ /// /** \f$ pTOut = \left[\begin{array}{cc} * R^t &amp; (-R^t*r) \\ * 0_{31} &amp; 1 * \end{array}\right]\f$ */ /// /// &lt;/summary&gt; /// &lt;returns&gt; /// the Transform inverse /// &lt;/returns&gt; Transform inverse() const; /// &lt;summary&gt; /// Create a Transform initialized with explicit rotation around x axis. /// /** \f$ pT = \left[\begin{array}{cccc} * 1.0 &amp; 0.0 &amp; 0.0 &amp; 0.0 \\ * 0.0 &amp; cos(pRotX) &amp; -sin(pRotX) &amp; 0.0 \\ * 0.0 &amp; sin(pRotX) &amp; cos(pRotX) &amp; 0.0 \\ * 0.0 &amp; 0.0 &amp; 0.0 &amp; 1.0 \end{array}\right]\f$ */ /// &lt;/summary&gt; /// &lt;param name="pRotX"&gt; the float value for angle rotation in radian around x axis &lt;/param&gt; static Transform fromRotX(const float pRotX); /// &lt;summary&gt; /// Create a Transform initialized with explicit rotation around y axis. /// /** * \f$ pT = \left[\begin{array}{cccc} * cos(pRotY) &amp; 0.0 &amp; sin(pRotY) &amp; 0.0 \\ * 0.0 &amp; 1.0 &amp; 0.0 &amp; 0.0 \\ * -sin(pRotY) &amp; 0.0 &amp; cos(pRotY) &amp; 0.0 \\ * 0.0 &amp; 0.0 &amp; 0.0 &amp; 1.0 * \end{array}\right]\f$ */ /// &lt;/summary&gt; /// &lt;param name="pRotY"&gt; the float value for angle rotation in radian around y axis &lt;/param&gt; static Transform fromRotY(const float pRotY); /// &lt;summary&gt; /// Create a Transform initialized with explicit rotation around z axis. /// /** * \f$ pT = \left[\begin{array}{cccc} * cos(pRotZ) &amp; -sin(pRotZ) &amp; 0.0 &amp; 0.0 \\ * sin(pRotZ) &amp; cos(pRotZ) &amp; 0.0 &amp; 0.0 \\ * 0.0 &amp; 0.0 &amp; 1.0 &amp; 0.0 \\ * 0.0 &amp; 0.0 &amp; 0.0 &amp; 1.0 * \end{array}\right]\f$ */ /// &lt;/summary&gt; /// &lt;param name="pRotZ"&gt; the float value for angle rotation in radian around z axis &lt;/param&gt; static Transform fromRotZ(const float pRotZ); /// &lt;summary&gt; /// Create a Transform initialize with euler angle. /// /// H = fromRotZ(pWZ)*fromRotY(pWY)*fromRotX(pWX) /// /// &lt;/summary&gt; /// &lt;param name="pWX"&gt; the float value for euler angle x in radian &lt;/param&gt; /// &lt;param name="pWY"&gt; the float value for euler angle y in radian &lt;/param&gt; /// &lt;param name="pWZ"&gt; the float value for euler angle z in radian &lt;/param&gt; static Transform from3DRotation( const float&amp; pWX, const float&amp; pWY, const float&amp; pWZ); /// &lt;summary&gt; /// Create a Transform initialize with explicit value for translation part. /// /** * \f$ pT = \left[\begin{array}{cccc} * 1.0 &amp; 0.0 &amp; 0.0 &amp; pX \\ * 0.0 &amp; 1.0 &amp; 0.0 &amp; pY \\ * 0.0 &amp; 0.0 &amp; 1.0 &amp; pZ \\ * 0.0 &amp; 0.0 &amp; 0.0 &amp; 1.0 * \end{array}\right]\f$ */ /// &lt;/summary&gt; /// &lt;param name="pX"&gt; the float value for translation axis x in meter (r1_c4) &lt;/param&gt; /// &lt;param name="pY"&gt; the float value for translation axis y in meter (r2_c4) &lt;/param&gt; /// &lt;param name="pZ"&gt; the float value for translation axis z in meter (r3_c4) &lt;/param&gt; static Transform fromPosition( const float pX, const float pY, const float pZ); /// &lt;summary&gt; /// Create a Transform initialize with explicit value for translation part and euler angle. /// /// H = fromRotZ(pWZ)*fromRotY(pWY)*fromRotX(pWX) /// /// then /// /// H.r1_c4 = pX /// /// H.r2_c4 = pY /// /// H.r3_c4 = pZ /// /// &lt;/summary&gt; /// &lt;param name="pX"&gt; the float value for translation axis x in meter (r1_c4) &lt;/param&gt; /// &lt;param name="pY"&gt; the float value for translation axis y in meter (r2_c4) &lt;/param&gt; /// &lt;param name="pZ"&gt; the float value for translation axis z in meter (r3_c4) &lt;/param&gt; /// &lt;param name="pWX"&gt; the float value for euler angle x in radian &lt;/param&gt; /// &lt;param name="pWY"&gt; the float value for euler angle y in radian &lt;/param&gt; /// &lt;param name="pWZ"&gt; the float value for euler angle z in radian &lt;/param&gt; static Transform fromPosition( const float&amp; pX, const float&amp; pY, const float&amp; pZ, const float&amp; pWX, const float&amp; pWY, const float&amp; pWZ); /// &lt;summary&gt; /// Compute the Transform between the actual /// Transform and the one given in argument: /// /// result: inverse(pT1)*pT2 /// /// &lt;/summary&gt; /// &lt;param name="pT2"&gt; the second transform &lt;/param&gt; Transform diff(const Transform&amp; pT2) const; /// &lt;summary&gt; /// Compute the squared distance between the actual /// Transform and the one given in argument (translation part): /// /// \f$(pT1.r_1c_4-pT2.r_1c_4)^2+(pT1.r_2c_4-pT2.r_2c_4)^2+(pT1.r_3c_4-pT2.r_3c_4)^2\f$ /// &lt;/summary&gt; /// &lt;param name="pT2"&gt; the second Transform &lt;/param&gt; /// &lt;returns&gt; /// the float squared distance between the two Transform: translation part /// &lt;/returns&gt; float distanceSquared(const Transform&amp; pT2) const; /// &lt;summary&gt; /// Compute the distance between the actual /// Transform and the one given in argument: /// /// \f$\sqrt{(pT1.r_1c_4-pT2.r_1c_4)^2+(pT1.r_2c_4-pT2.r_2c_4)^2+(pT1.r_3c_4-pT2.r_3c_4)^2}\f$ /// &lt;/summary&gt; /// &lt;param name="pT2"&gt; the second Transform &lt;/param&gt; /// &lt;returns&gt; /// the float distance between the two Transform /// &lt;/returns&gt; float distance(const Transform&amp; pT2) const; /// &lt;summary&gt; /// Return the Transform as a vector of float: /// /** \f$ \begin{array}{cccc} * [r_1c_1, &amp; r_1c_2, &amp; r_1c_3, &amp; r_1c_4, \\ * r_2c_1, &amp; r_2c_2, &amp; r_2c_3, &amp; r_2c_4, \\ * r_3c_1, &amp; r_3c_2, &amp; r_3c_3, &amp; r_3c_4, \\ * 0.0, &amp; 0.0, &amp; 0.0, &amp; 1.0] * \end{array}\f$ */ /// &lt;/summary&gt; std::vector&lt;float&gt; toVector() const; }; // end struct </code></pre> <p>and I want to call constructor of struct Transform </p> <pre><code> AL::Math::Transform *mytransform ; mytransform= new AL::Math::Transform(); /** ** or **/ std::vector&lt;float&gt; transform_ = motion-&gt;getTransform(currentCamera, 2, true); AL::Math::Transform mytransform2(transform_); </code></pre> <p>How can I instanciate a struct in c++ ? call constructor ? </p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload