From: Allen B. <al...@vr...> - 2004-09-16 21:05:55
|
Patrick Hartling wrote: > What is the fix for this: > > gmtl/TriOps.h:60: error: no match for 'operator*' in 'gmtl::operator > +(const > gmtl::VecBase<T, SIZE, R1>&, const gmtl::VecBase<T, SIZE, R2>&) [with > T = > double, unsigned int SIZE = 3, R1 = > gmtl::meta::VecBinaryExpr<gmtl::VecBase<double, 3, > gmtl::meta::DefaultVecTag>, gmtl::VecBase<double, 3, > gmtl::meta::DefaultVecTag>, gmtl::meta::VecPlusBinary>, R2 = > gmtl::meta::DefaultVecTag]((+(+tri)->gmtl::Tri<DATA_TYPE>::operator[] > [with > DATA_TYPE = double](2))) * one_third' > > The code that is not compiling is this (from gmtl/TriOps.h modified to > include gmtl/VecOps.h): > > template< class DATA_TYPE > > Point<DATA_TYPE, 3> center( const Tri<DATA_TYPE>& tri ) > { > const float one_third = (1.0f/3.0f); > return (tri[0] + tri[1] + tri[2]) * one_third; > } > > It seems as though the operator* overload in gmtl/VecOps.h isn't > matching the above for some reason, but I can't figure out why. I've > tried calling the gmtl::Point<DATA_TYPE,3> constructor explicitly inside > the parentheses performing the point addition, but that doesn't help. > Based on what you say below, the above shouldn't be affected at all by > the changes you just checked in, but I don't have a very good > understanding of this stuff in general. Strange, try using: DATA_TYPE(one_third) and see what happens. Teh strange part of this is the operator* above seems to have two VecBase params. This should not be allowed. -Allen > > -Patrick > > > On Thu, 2004-09-16 at 14:51 -0500, Allen Bierbaum wrote: > >>I just merged my work on expression templates from the work branch into >>the CVS head of GMTL. >> >>This is a *major* feature addition and re-working of the VecBase (Vec & >>Point) classes and all operators that work on them. >> >>This change uses expression templates to remove temporary objects from >>expression evaluation and potentially allow compilers to better optimize >>the code. >> >>For example, with the previous code: >> >>vec1 = vec2 + vec3 + (vec4 * 6) >> >>that would have created 3 temporary vectors. In the new code the >>expression templates output code that directly computes the final value >>from the given operands. This has shown at least a 2x performance >>increase in my tests. >> >>The code is far from perfect though and could definitely be optimized >>much further. (especially by someone that knows intel assembly and has >>some patience) >> >>There is one common compiler error to be aware of. It is not possible >>to pass expression templates where VecBase/Vec/Point objects are expected. >> >>Details: >> >>GMTL makes extensive use of expression templates. These templates come >>into play when evaluating statement such as: >> >>gmtl::Vec3f vec1, vec2, vec3; >>vec1 = vec2 + (vec3 * 6.0); >> >>When evaluating the expression on the second line, GMTL creates an >>expression template tree to fully evaluate this expression when = is >>called. The details of this process are normally hidden from the user, >>but can come to the forefront when a method expects a Vec or Point >>argument and is passed an expression. For example: >> >>void myMethod(gmtl::Vec3f vec) >>{ ... } >> >>gmtl::Vec3f vec1, vec2; >> >>myMethod(vec1); // Works correctly >>myMethod(vec1 + vec2); // Fails to compile >> >>The reason the second line fails to compile is that the type for "vec1 + >>vec2" is not a Vec3f. It is an expression template that describes how >>to sum two Vec3f's. (You may expect an autoconversion to happen, but it >>does not because of template argument deduction rules). >> >>There are two solutions to this, either explicitly construct a temporary >>object to pass to the method (which is what an auto conversion would do >>anyway) or write the method to handle expression templates. This second >>option is not difficult, but does require a further understanding of >>GMTL then is documented here. >> >>Here is how the first option could be used: >> >>myMethod(gmtl::Vec3f(vec1 + vec2)); // Creates a temporary to pass in >> >> >> >>In closing: Give the code and try and let me know what you think. :) >> >> >>-Allen -- -- Allen Bierbaum al...@vr... -- Research Assistant and PhD Candidate -- VR Juggler Team www.vrjuggler.org -- Virtual Reality Applications Center www.vrac.iastate.edu |