View Full Version : Converting own vector to glm:vec3

06-01-2010, 02:01 PM

I'm trying to convert my own vector to a glm:vec3 like this:

MyVec<float> v1;
glm::vec3 v2 = v1;

In my template vector class MyVec I have added this
conversion/cast operator:

template <class Real>
MyVec<Real>::operator glm::vec3() const
return glm::vec3((float) Vector[0], (float) Vector[1], (float) Vector[2]);

Compiling results in:
MyVec<Real> cannot be converted to glm::detail::tvec3<T>.

What am I doing wrong?

Thanks for help!

06-01-2010, 04:51 PM
When I read you code I thought it should have worked... so I gave it a try and guess what it works! :p

#include "glm/glm.hpp"

template <class T>
struct vec
operator glm::vec2() const;
float x, y;

template <class T>
vec<T>::operator glm::vec2() const
glm::vec2 v;
v.x = x;
v.y = y;
return v;

int main(int argc, char *argv[])
vec<float> A;
glm::vec2 B = A;

return 0;

Maybe there is something specific in your code that implies this behaviour... I can't really what. Could you provide your implementation of MyVec?

06-01-2010, 07:57 PM

thanks your code compiles fine! I also have
a const cast operator defined in MyVec:

template <class T>
vec<T>::operator const glm::vec3() const
return glm::vec3(x, y, z);

Adding this to your code example also gives compile errors.

But let me explain my original intention. Basically I want
this code to work:

MyVec<float> v;

Therefor I added the (non-const) cast operator which gave
me compile errors. So my first assumption was that I have
to add a const cast operator to make it work with the
scale function that requires a const argument.

So now I'm stuck with two questions which are maybe more
C++ related than to GLM :) But maybe you know the answer! :D

1. Why is your example code working fine UNTIL I add
the const cast operator?

2. How can I make this code work:

MyVec<float> v;

Thanks a lot for you help! :)

06-02-2010, 05:47 AM
The transformation functions are mapped on the deprecated OpenGL transform functions:

I guess:
glm::mat4 M = glm::scale(glm::mat4(1.0), glm::vec3(v));

Due to the template implementation, I can see some trouble for the compiler to actually perform an implicit cast. By the way, implicit cast are evil! :p